Java Collection.sort(mList,比较器)需要很长时间,具体取决于比较器

时间:2016-12-20 00:11:53

标签: java sorting

我有大约2000条有关音乐列表的记录。 比如说,每个音乐对象都包含TitleArtist

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上。

2 个答案:

答案 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直接影响到排序机制。

我应该考虑的一件事:/

线程已关闭。谢谢大家。