我有大约 2000 条关于音乐列表的记录。
比如,每个音乐对象都包含 Title
和 Artist
public static class TitleComparator implements Comparator<MySongEntry> {
@Override
public int compare(MySongEntry e1, MySongEntry e2) {
return e1.getTitle().compareToIgnoreCase(e2.getTitle());
}
}
public static class ArtistComparator implements Comparator<MySongEntry> {
@Override
public int compare(MySongEntry e1, MySongEntry e2) {
return e1.getArtist().compareToIgnoreCase(e2.getArtist());
}
}
请忽略空的歌曲名称/艺术家、特殊字符或语言环境等极端情况
剖析
Collections.sort(mList, new MySongEntry.TitleComparator());
大约需要 130~150 毫秒,
但是
Collections.sort(mList, new MySongEntry.ArtistComparator());
需要 该死的 600~1500 毫秒。
我实在想不出原因。 Title 和 Artist 都是 String
类型。长度不同。此外,实例化这些比较器都花费了无关紧要的时间 (< 0ms)
谁有类似经历?
顺便说一句,这是在 Android 上。
最佳答案
我猜这是数据本身的性质。
在您的数据中,按标题排序时比较可能较少,而对于作者,则比较多。这是因为标题更独特。
如果您有两个基本相同的字符串,它将逐个字符地比较每个字符串,直到它认为一个大于或小于另一个(或等于)。
所以当你有很多相同的字符串时,假设有 10 个字符串“AA-”,其中“-”是一些随机的唯一字符,与我们有“-AA”相比,与这 10 个字符串的比较会更多(因为它可以立即判断是否更大,而不必遍历整个字符串)。
关于Java Collection.sort(mList, comparator) 需要很长时间,具体取决于比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41233006/