Collection.sort奇怪的错误与排序

时间:2018-01-25 13:46:06

标签: java android sorting collections

我试图按日期从早到老排序。但我有奇怪的错误/错误//我不知道如何解释。我正在使用对象模型。这里是排序的代码

Collections.sort(models, new Comparator<Model>() {
            @Override
            public int compare(Model item1, Model item2) {
                int s1 = (int) item1.getUpdateAt();
                int s2 = (int) item2.getUpdateAt();
                return (s2 - s1);
            }
        });

及其信息如何排序:

model: tyuiop time: 1484473575000
model: 0 time: 1516887006000
model: 1 time: 1516886848000
model: 2 time: 1516886840000
model: 3 time: 1516886833000
model: 4 time: 1516886825000
model: 5 time: 1516886818000
model: vhvyvtct time: 1516886592000
我们从0看到“vhvyvtctc”一切都很好,但“tyuiop”在错误的地方。我不明白为什么。可以帮我修复这个......错误吗?请

UPD Omg im idiot。真的是整数和长。我的头很傻。谢谢你们 将代码更改为此样式:

 Collections.sort(models, new Comparator<Model>() {
                @Override
                public int compare(Model item1, Model item2) {
                    long s1 = item1.getUpdateAt();
                    long s2 = item2.getUpdateAt();
                    return Long.compare(s2, s1);
                }
            });

它的工作完美。谢谢你们。

2 个答案:

答案 0 :(得分:1)

不要让事情变得复杂使用Long class的比较方法

 Collections.sort(models, new Comparator<Model>() {
    @Override
    public int compare(Model item1, Model item2) {
        return Long.compare(item1.getUpdateAt(), item2.getUpdateAt());
    }
});

答案 1 :(得分:1)

如果使用某些调试信息运行代码,您可以看到长值无法正确解释为int值:

List<Long> longList = Arrays.asList(1516887006000L, 1516886848000L, 1516886840000L, 1516886833000L, 1516886825000L, 1516886818000L,
        1516886592000L, 1484473575000L);
Collections.sort(longList, (o1, o2) -> {
    System.out.println("Comparing: " + o1.intValue() + " with " + o2.intValue());
    return (o2.intValue() - o1.intValue());
});

输出:

  

比较:763392512与763550512
  比较:763384512与763392512
  比较:763377512与763384512
  比较:763369512与763377512
  比较:763362512与763369512
  比较:763136512与763362512
  比较:-1585109416与763136512   比较:-1585109416与763377512
  比较:-1585109416与763392512
  比较:-1585109416与763550512

您可以看到值不正确。所以最好使用Long的比较:

Collections.sort(models, (o1, o2) -> {
    return o1.getUpdateAt().compareTo(o2.getUpdateAt());
});