gpt4 book ai didi

java - 在 Java 中使用嵌套泛型组织数据(Android)

转载 作者:行者123 更新时间:2023-12-01 08:49:29 25 4
gpt4 key购买 nike

我正在创建一个音乐播放器应用程序。我从名为 SongInfo 的类中的目录中检索数据,如下所示:

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,单击时显示艺术家列表 -> 打开专辑 fragment ,其中包含所选艺术家的专辑列表 -> 打开歌曲 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;

我非常确定这是错误的方法,因为如果我有更多层怎么办?我正在寻找更好的方法来做到这一点。我只需要一个提示,但插图/解释会很棒。谢谢:)

最佳答案

假设我们从这些类开始:

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; }
}

地点:

  • Song 是您现在使用的相当不幸的名称 SongInfo
  • Artist 是一个您还没有的类,但您应该拥有。如果您无法处理这个问题,那么每当您看到 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 );

关于java - 在 Java 中使用嵌套泛型组织数据(Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com