Java:比较方法违反了其一般契约

标签 java android collections comparator mediastore

我从上面得到了一个异常(exception),我知道这里经常讨论这个异常(exception)。无论如何,其他人不会告诉我我的代码有什么问题。这些 StyleAlbum 只是音乐专辑。 getAdded()int 形式返回最后一首歌曲添加到 Android MediaStore 的时间(以毫秒为单位)。 这种情况仅发生在某些设备上!

代码:

public static List<StyleAlbum> sortAdded() {
    List<StyleAlbum> mAlbums = new ArrayList<>();
    mAlbums.addAll(Library.getAlbums());
    Collections.sort(mAlbums, new Comparator<StyleAlbum>() {
        @Override
        public int compare(StyleAlbum lhs, StyleAlbum rhs) {
            if (lhs.getAdded() > rhs.getAdded()) {
                return -1;
            } else return 1;
        }
    });
    return mAlbums;
}

最佳答案

您的比较器不会考虑两个项目是否相等,即它永远不会返回零。你应该使用类似的东西

return Integer.compare(lhs.getAdded(), rhs.getAdded());

否则结果至少是不一致的,并且根据算法的不同,它甚至可能是完全错误的。在这种情况下,Tim sort(JDK 中使用的算法)足够聪明,可以告诉您存在错误。

注意:我使用 Integer.compare 比较整数,而不是减法(感谢 Louis Wasserman),以避免溢出错误

关于Java:比较方法违反了其一般契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35732659/

相关文章:

java - getHeight 和 getMeasuredHeight 返回 0,即使在 Runnable 中也是如此

java - 在打印日志时使用方法名称作为记录器的参数是不好的做法吗?

java - 当线程完成其工作或在 android 中返回一个值后,在 MainActivity 中运行一行

java - 除了 Collections.unmodifyingList() 之外,还有哪些方法可以使 arraylist 变为只读?

java - 在 Oracle WebLogic Server 12.1.2.0.0 中创建自定义身份验证提供程序

应用程序启动时加载程序 dalvik.system.PathClassLoader 中的 java.lang.ClassNotFoundException

Android 位置管理器问题

java - Android 测试中的 SSLHandshakeException

java - 检查 map 中存在的值列表的最佳方法

java - 异常.getmessage() 返回 null