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

时间:2016-03-01 20:20:49

标签: java android collections comparator mediastore

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

代码:

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 个答案:

答案 0 :(得分:1)

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

这样的东西
return Integer.compare(lhs.getAdded(), rhs.getAdded());

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

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

答案 1 :(得分:0)

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