2017-02-26 7 views
0

私は音楽プレーヤーアプリを作成しています。私はこのようになりますSongInfoという名前のクラス内のディレクトリからデータを取得:Javaでネストされたジェネリックスを使用してデータを整理する(Android)

public class SongInfo { 

//id of song 
private long _ID; 

//song name 
private String title; 

//artist name 
private String artistName; 

//album name 
private String albumName; 

//song duration 
long duration; 

//year of release 
private String year; 

//constructor 

//comparators to sort data 

マイアプリをクリックする上でのアーティストの一覧を表示する

ArtistsFragmentがあるような構造を持っている - >それは選択したアーティストのアルバムのリストを持つアルバムを開きます - >選択したアルバムの曲のArrayListを持つSongs Fragmentを開きます。私はそれを行うには間違った方法は非常に確信して

//contains most of the info of the song 
ArrayList<SongInfo> songs; 

//contains an arrayList of songs 
ArrayList<ArrayList<SongInfo>> albums; 

//contains an arraylist of albums  
Arraylist<ArrayList<ArrayList<SongInfo>>> artists; 

が、私はより多くの層を持っていた場合はどのようなCOS:私が代わりにやってしまうことは、この種のデータ構造を作成するのですか?私はこれを行うより良い方法を探しています。私はちょっとヒントが必要だけど、イラストや説明は素晴らしいだろう。感謝:)

+0

"臓器このデータを次のような3つの異なる断片にします:アーティストのリスト - >選択したアーティストのアルバム - >選択したアルバムの曲。あなたが文章の断片だけで、あなたが何人かの未知の人々にあなたの心に持っている奇妙なアイデアを説明することができれば、それはいいことではないでしょうか?しかし、私はこれがあなただけに理にかなっているのではないかと心配しています。 –

+0

@MikeNakisもっと情報を追加しました。質問を理解している他の疑問がある場合は、教えてください。 – Shubham

+0

'List '( 'infos'?)と' List '(' songs'という名前の?)というクラスを持つ 'Album'クラスを作成します。 –

答えて

1

は、我々はこれらのクラスを開始したとします

  • Songは、あなたが今SongInfo
  • Artist、むしろ不幸な名前で呼んでいるものですが、クラスである:

    public static class Song 
    { 
        String title; 
        Artist artist; 
        Album album; 
        Song(String title, Artist artist, Album album) 
         { this.title = title; this.artist = artist; this.album = album; } 
        @Override public String toString() { return "Song: " + title; } 
    } 
    
    public static class Artist 
    { 
        String name; 
        Artist(String name) { this.name = name; } 
        @Override public String toString() { return "Artist: " + name; } 
    } 
    
    public static class Album 
    { 
        String name; 
        Album(String name) { this.name = name; } 
        @Override public String toString() { return "Album: " + name; } 
    } 
    

    あなたはまだ持っていませんが、あなたはすべきです。あなたがそれを処理できない場合は、Artistがその中にアーティスト名を持つStringと考えるといつでも。

  • Albumはあなたがまだ持っていない別のクラスですが、そうすべきです。あなたがそれを処理できない場合は、Albumと表示されたときには、Stringと思って、その中にアルバムのタイトルがあります。

そして、我々は、このデータセットで開始したとします。

Artist artist1 = new Artist("Artist1"); 
    Artist artist2 = new Artist("Artist2"); 
    Set<Artist> artists = new HashSet<>(Arrays.asList(artist1, artist2)); 
    Album album1 = new Album("Album1"); 
    Album album2 = new Album("Album2"); 
    Set<Album> albums = new HashSet<>(Arrays.asList(album1, album2)); 
    Song song11a = new Song("Song11a", artist1, album1); 
    Song song11b = new Song("Song11b", artist1, album1); 
    Song song22a = new Song("Song22a", artist2, album2); 
    Song song22b = new Song("Song22b", artist2, album2); 
    List<Song> songs = Arrays.asList(song11a, song11b, song22a, song22b); 

その後、次は何をしたいあなたを与える:

Collection<Song> getSongsByArtist(Collection<Song> songs, Artist artist) 
{ 
    return songs.stream().filter(song -> song.artist == artist) 
     .collect(Collectors.toList()); 
} 

Collection<Album> getAlbumsByArtist(Collection<Song> songs, Artist artist) 
{ 
    return songs.stream().filter(song -> song.artist == artist) 
     .map(song -> song.album).collect(Collectors.toSet()); 
} 
をし、次はあなたが常に知りたいと思ったすべてを与えるだろうあなたのデータセットについて質問しましたが、質問するのを恐れていました:

Map<Song,Artist> artistsBySong = songs.stream() 
    .collect(Collectors.toMap(Function.identity(), song -> song.artist)); 
Map<Song,Album> albumsBySong = songs.stream() 
    .collect(Collectors.toMap(Function.identity(), song -> song.album)); 
Map<Artist,List<Song>> songsByArtist = songs.stream() 
    .collect(Collectors.groupingBy(song -> song.artist)); 
Map<Album,List<Song>> songsByAlbum = songs.stream() 
    .collect(Collectors.groupingBy(song -> song.album)); 
assert songs.stream().map(song -> song.album) 
    .collect(Collectors.toSet()).equals(albums); 
assert songsByAlbum.keySet().equals(albums); 
関連する問題