【问题标题】:Java Collection.sort(mList, comparator) takes long time depending on comparatorJava Collection.sort(mList,comparator) 需要很长时间,具体取决于比较器
【发布时间】:2016-12-20 00:11:53
【问题描述】:

我有大约 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 类型。长短不一。此外,实例化这些比较器都花费了不相关的时间(

有人有类似经历吗?

顺便说一句,这是在 Android 上。

【问题讨论】:

  • 会不会是您的 mList 已经快按标题排序了?所以第一种工作要做的很少,但第二种有很多工作。
  • @leeyuwah 可能。这可能是唯一的原因。我会看看我是否可以随机混合它并获得更好的分析。
  • @PhilippClaßen 很确定不是那些。我确保将其隔离为逻辑。
  • 我很感激有人能解释为什么我应该投反对票 :) 谢谢。

标签: java sorting


【解决方案1】:

我的猜测是数据本身的性质。

在您的数据中,按标题排序时比较可能较少,而对于作者来说,比较多。这是因为标题更独特。

如果你有两个相当相同的字符串,它将逐个字符地比较每个字符串,直到它认为一个大于或小于另一个(或等于)。

因此,当您有很多相同的字符串时,假设有 10 个字符串“AA-”,其中“-”是一些随机的唯一字符,与这 10 个字符串的比较会比我们有“-AA”的情况更多(因为它可以立即确定它是否更大,而不必遍历整个字符串)。

【讨论】:

  • 谢谢@K Weston。数据集非常笼统。更多的是关于如何首先添加 mList 的数据集。请看一下我自己的答案。祝你有美好的一天
  • 哦,我当然同意这个可以生效!
  • 啊,这很有道理。很好的答案!
【解决方案2】:

所以@leeyuiwah 对我的评论是正确的。

我加了

long seed = System.nanoTime();
Collections.shuffle(mList, new Random(seed));

就在我打电话给Collections.sort(..) 之前,现在他们都有相似的时间。

我首先填充mList 的方式直接影响了排序机制。

我应该考虑的一件事:/

线程关闭。谢谢大家。

【讨论】:

    猜你喜欢
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多