当前位置: 首页 > 知识库问答 >
问题:

Java:比较法违反其总承包

范楚
2023-03-14

我从上面得到了一个例外,我知道这里经常讨论SO。无论如何,其他人不会告诉我我的代码有什么问题。这些StyleAlbum只是音乐专辑getAdded()返回最后一首歌曲被添加到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;
}

共有2个答案

皇甫敏达
2023-03-14

如果两个值相同,则应在比较方法中返回0。特别是,从对象到其本身的比较应该给出0。

姜聪
2023-03-14

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

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

否则,结果至少是不一致的,并且取决于算法,它甚至可能完全错误。在这种情况下,Tim sort(JDK中使用的算法)足够智能,可以告诉您有一个错误。

注意:我用< code>Integer.compare而不是减法(感谢路易斯·乏色曼)来比较整数,以避免溢出错误

 类似资料:
  • 我已经在类上实现了Comaprable,它给了我比较方法违反了它的总合同!,由于有一些值返回为 null,代码如下 公共静态比较器名称比较器 = 新比较器() {

  • 我试图使用比较器基于两个字符串的比较对数组列表进行排序,但我最终使用的比较方法违反了它的一般契约错误。如果字符串中出现空值比较,我该如何处理? 密码 错误

  • 问题内容: 有人可以简单地向我解释一下,为什么此代码会引发异常,“比较方法违反了它的一般约定!”,我该如何解决? 问题答案: 你的比较器不是可传递的。 让是的父,并成为母公司。既然和,那一定是这样。但是,如果在和上调用比较器,它将返回零,即。这违反了合同,因此引发异常。 该库可以很好地检测到这一点并让你知道,而不是行为不规律。 满足传递性要求的一种方法是遍历整个链,而不仅仅是查看直接祖先。

  • 我有一个类 ,它看起来像这样: 接下来,我有<代码>列表 其中和是当前位置的纬度和经度。有时,代码会抛出异常 我知道,如果方法不满足传递条件,则会抛出此异常。我在这里找到了一些信息:比较方法违反了其总合同!我理解为什么在引用的问题中抛出异常,但我仍然不知道为什么在我的代码中抛出异常。 你能帮我一下吗?谢了。 更新 的列表用于的适配器。如果有新的GPS位置,则对中的数据进行排序。代码如下所示: 和方

  • 我收到以下错误:“比较方法违反了它的一般合同!”当使用下面的比较器时,我无法使用jUnit复制异常。我想知道是什么导致了这个问题,以及如何复制它。有其他人也有同样的问题,但不知道如何复制。 使用以下方法调用该代码: 感谢任何帮助。 额外信息:该错误似乎发生在Java utils中的TimSort类中,并来自一个名为mergeLo的方法。链接:http://grepcode.com/file/rep

  • 我发现了许多与此标题相关的重复问题,但没有一个与我的问题有关,因为我的问题无法通过崩溃追踪。我不断收到有关此标题的许多不同的崩溃。 检查此示例(仅在android 4上发生): 我通过研究发现,这种情况发生在比较/排序时,而忽略了某个条件。同时,在我的代码中,我没有使用文档/示例中提到的比较或排序方法。 非常感谢任何建议。