Чтобы повысить производительность, измените artists
с ArrayList<Artist>
на HashMap<String, Artist>
.
Таким образом, вы можете заменить самый внутренний цикл последовательного поиска на быстрый и простой поиск по карте .
Map<String, Artist> artists = new HashMap<>();
for (Song song : songs) {
for (String artistName : song.getArtists()) {
Artist artist = artists.get(artistName);
if (artist == null) {
artist = new Artist(artistName, new ArrayList<>());
artists.put(artistName, artist);
}
artist.Songs.add(song);
}
}
В Java 8+ это можно улучшить, особенно если немного изменить класс Artist
.
Map<String, Artist> artists = new HashMap<>();
for (Song song : songs) {
for (String artistName : song.getArtists()) {
artists.computeIfAbsent(artistName, Artist::new).addSong(song);
}
}
class Artist {
public final String name;
public final ArrayList<Song> songs = new ArrayList<>();
Artist(String name) {
this.name = name;
}
void addSong(Song song) {
this.songs.add(song);
}
}
Примечание:Соглашение об именах Java заключается в том, чтобы имена полей начинались со строчной буквы, поэтому второе решение, приведенное выше, было изменено, чтобы отразить это.