【发布时间】:2018-06-07 07:01:08
【问题描述】:
我正在尝试获取歌曲列表中艺术家的 ArrayList(或 Set,或任何类似内容)。每首歌曲都有 getArtists 函数,它返回参与歌曲的每位艺术家的数组。
目标是有一个艺术家列表,每个艺术家都应该有一个列表(或集合,以更快者为准),其中包含他参与的所有歌曲。
我的代码有效,但速度很慢(1600 首歌曲需要 5 秒)。如何加快速度?
我的代码
private ArrayList<Artist> getArtistsFromSongs(List<Song> songs)
{
long start = System.currentTimeMillis();
ArrayList<Artist> artists = new ArrayList<>();
for (Song song : songs)
{
String[] artistsStringArray = song.getArtists();
for (String artistString : artistsStringArray)
{
boolean artistAlreadyExists = false;
int heExistsAt = -1;
for (int i = 0; i < artists.size(); i++)
{
if (artists.get(i).name.equals(artistString))
{
artistAlreadyExists = true;
heExistsAt = i;
}
}
if (artistAlreadyExists)
{
artists.get(heExistsAt).songs.add(song);
} else
{
Artist newArtist = new Artist(artistString, new ArrayList<>());
newArtist.songs.add(song);
artists.add(newArtist);
}
}
}
long test = System.currentTimeMillis() - start; //~5500 milliseconds
return artists;
}
班级
class Artist
{
public final String name;
public final ArrayList<Song> songs;
Artist(String name, ArrayList<Song> songs)
{
this.name = name;
this.songs = songs;
}
}
提前致谢。
【问题讨论】:
-
性能优化必须始终附带详细分析。所以,测量它!另外,提供一个完整的例子。我不认为你的迭代本身很慢。所以代码里面可能有一些东西是slow。我们无法仅通过查看代码 sn-p 来判断。获取一个框架并分析您在哪个代码部分花费的时间最多。
-
请注意,对于数组而言,常规 for 循环比增强型 for 循环稍快。生成的字节码虽然非常相似,但差异非常小。
-
@Zabuza 这个迭代是“缓慢”的根源。我不知道如何为您提供更多详细信息.. 其他所有内容都经过测试并在 1 秒内运行,而这个特定部分大约需要 5.5 秒。查看更新的问题。
-
是对象歌曲和艺术家的简单对象,还是类似于 jpa/hibernate 实体
标签: java list optimization arraylist set