我有大约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~150ms,
但是
Collections.sort(mList, new MySongEntry.ArtistComparator());
该死的 600~1500ms。
我真的想不出原因。标题和艺术家都是String
类型。长度各不相同。而且,实例化那些比较器都花费了不相关的时间(<0ms)
任何人都有类似的经历吗?
顺便说一句,这是在Android上。
答案 0 :(得分:3)
我的猜测是数据本身的性质。
在您的数据中,按标题排序时可能会有较少的比较,而对于作者,则可能会有更多。这是因为标题更独特。
如果你有两个相当相同的字符串,它会逐字符地比较每个字符串,直到它认为一个字符串大于或小于另一个字符串(或相等)。
所以当你有很多相同的字符串时,可以说10个字符串&#34; AA - &#34;在哪里&#34; - &#34;是一些随机的独特字符,与这些10个字符串相比,如果我们有&#34; -AA&#34; (因为它可以立即确定它是否更大,而不必遍历整个字符串)。
答案 1 :(得分:2)
所以@leeyuiwah对我的评论是正确的。
我添加了
long seed = System.nanoTime();
Collections.shuffle(mList, new Random(seed));
在我致电Collections.sort(..)
之前,现在他们都有相似的时间。
我如何首先填充mList
直接影响到排序机制。
我应该考虑的一件事:/
线程已关闭。谢谢大家。