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

标签 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~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/

相关文章:

java - 无法进入jsp文件中的if语句

c++ - QTableWidgetItem 子类运算符 <() 在对 QTableWidget 进行排序时永远不会被调用

python - 按多列对 Pandas Dataframe 进行分组以获得特定值

c++ - 将字符串存储到 vector 中

c# - 使用 2 个字段对 C# 进行列表排序

java - 将接口(interface)嵌套在具体类中的可行设计替代方案是什么?

java - 如何在 Struts html :select tag 中使用枚举

java - Android 中未找到 KeyGenerator AES 实现

java - 具有重写的fileInputFormat的MapReduce无法输出结果

algorithm - 如何搜索影响空间点的对象