2016-03-01 90 views
0

我从上面得到了异常,我知道这是经常在这里讨论的。无论如何,其他人不会告诉我我的代码有什么问题。这些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; 
} 
+0

您可以编辑您的问题,并张贴满例外,包括堆栈跟踪? –

回答

0

你应该在比较方法返回0,如果这两个值是相同的。尤其是,从对象到它本身的比较应该给出0.

1

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

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

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

注:我比较了Integer.compare,而不是减法(感谢路易斯·沃瑟曼)的整数,以避免溢出错误

+2

一般来说,您应该使用'Integer.compare'而不是仅仅减去,这会导致溢出错误。 –

+0

感谢您的更正@LouisWasserman! – Raffaele

相关问题