Comparison method violates its general contract!

源码

list.sorted((o1, o2) -> {
    return o1.getCreateTime().getTime() - o2.getCreateTime().getTime();
}).limit(limits).collect(Collectors.toList());

但是,此排序算法比老版本的算法多了如下几个限制条件,如果不注意,排序可能会抛异常

 1. 自反性,compare(x, y) = – compare(y, x)
 2. 传递性,如果compare(x, y) > 0, compare(y, z) > 0, 则必须保证compare(x, z) > 0
 3. 对称性, 如果compare(x, y) == 0, 则必须保证compare(x, z) == compare(y, z)

getTime()返回Long导致数据溢出,需要先判断大小再返回1 0 -1

pulledUrls.stream().sorted((o1, o2) -> {
    if (o1.getCreateTime().getTime() == o2.getCreateTime().getTime()) {
        return 0;
    } else {
        return o1.getCreateTime().getTime() > o2.getCreateTime().getTime() ? 1 : -1;
    }
}).limit(limits).collect(Collectors.toList());

Leave a Reply

Your email address will not be published. Required fields are marked *