From b767e4eca896dbae64c860b2921234c26fd64522 Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Mon, 8 Mar 2010 19:18:17 -0600 Subject: [PATCH] Share filter code and use SparseArray instead of HashMap --- src/org/kreed/vanilla/AlbumAdapter.java | 18 +---------- src/org/kreed/vanilla/ArtistAdapter.java | 18 +---------- src/org/kreed/vanilla/Song.java | 38 ++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/org/kreed/vanilla/AlbumAdapter.java b/src/org/kreed/vanilla/AlbumAdapter.java index 3d1c99d2..37420631 100644 --- a/src/org/kreed/vanilla/AlbumAdapter.java +++ b/src/org/kreed/vanilla/AlbumAdapter.java @@ -1,8 +1,5 @@ package org.kreed.vanilla; -import java.util.Arrays; -import java.util.HashMap; - import android.content.Context; import android.graphics.Color; import android.view.View; @@ -11,22 +8,9 @@ import android.widget.LinearLayout; import android.widget.TextView; public class AlbumAdapter extends AbstractAdapter { - private static Song[] filter(Song[] songs) - { - HashMap albums = new HashMap(); - for (int i = songs.length; --i != -1; ) { - Song song = songs[i]; - if (!albums.containsKey(song.albumId)) - albums.put(song.albumId, song); - } - Song[] result = albums.values().toArray(new Song[0]); - Arrays.sort(result, new Song.AlbumComparator()); - return result; - } - public AlbumAdapter(Context context, Song[] allSongs) { - super(context, filter(allSongs)); + super(context, Song.filter(allSongs, new Song.AlbumComparator())); } @Override diff --git a/src/org/kreed/vanilla/ArtistAdapter.java b/src/org/kreed/vanilla/ArtistAdapter.java index 091f408c..a37968f0 100644 --- a/src/org/kreed/vanilla/ArtistAdapter.java +++ b/src/org/kreed/vanilla/ArtistAdapter.java @@ -18,9 +18,6 @@ package org.kreed.vanilla; -import java.util.Arrays; -import java.util.HashMap; - import android.content.Context; import android.graphics.Color; import android.view.View; @@ -28,22 +25,9 @@ import android.view.ViewGroup; import android.widget.TextView; public class ArtistAdapter extends AbstractAdapter { - private static Song[] filter(Song[] songs) - { - HashMap artists = new HashMap(); - for (int i = songs.length; --i != -1; ) { - Song song = songs[i]; - if (!artists.containsKey(song.artistId)) - artists.put(song.artistId, song); - } - Song[] result = artists.values().toArray(new Song[0]); - Arrays.sort(result, new Song.ArtistComparator()); - return result; - } - public ArtistAdapter(Context context, Song[] allSongs) { - super(context, filter(allSongs)); + super(context, Song.filter(allSongs, new Song.ArtistComparator())); } @Override diff --git a/src/org/kreed/vanilla/Song.java b/src/org/kreed/vanilla/Song.java index 5b77acdf..8d66ae99 100644 --- a/src/org/kreed/vanilla/Song.java +++ b/src/org/kreed/vanilla/Song.java @@ -18,6 +18,7 @@ package org.kreed.vanilla; +import java.util.Arrays; import java.util.Comparator; import android.content.ContentResolver; @@ -26,6 +27,7 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.provider.MediaStore; +import android.util.SparseArray; public class Song implements Parcelable { int id; @@ -196,17 +198,49 @@ public class Song implements Parcelable { } } - public static class AlbumComparator implements Comparator { + public static class AlbumComparator implements IdComparator { public int compare(Song a, Song b) { return a.album.compareTo(b.album); } + + public int getId(Song song) + { + return song.albumId; + } } - public static class ArtistComparator implements Comparator { + public static class ArtistComparator implements IdComparator { public int compare(Song a, Song b) { return a.artist.compareTo(b.artist); } + + public int getId(Song song) + { + return song.artistId; + } + } + + public static interface IdComparator extends Comparator { + public int getId(Song song); + } + + public static Song[] filter(Song[] songs, IdComparator comparator) + { + SparseArray albums = new SparseArray(songs.length); + for (int i = songs.length; --i != -1; ) { + Song song = songs[i]; + int id = comparator.getId(song); + if (albums.get(id) == null) + albums.put(id, song); + } + + Song[] result = new Song[albums.size()]; + for (int i = result.length; --i != -1; ) + result[i] = albums.valueAt(i); + + Arrays.sort(result, comparator); + return result; } } \ No newline at end of file