gpt4 book ai didi

java - 比较方法违反了它的一般契约!优先级队列错误

转载 作者:行者123 更新时间:2023-12-02 13:14:10 24 4
gpt4 key购买 nike

我有一个优先级队列,在线程内的 while(true) 循环中进行操作。在某些情况下,我想获取队列内容并将其在数组中排序。我这样做:

Object[] array = sellQueues[0].toArray();
Arrays.sort(array);

该优先级队列的比较方法如下:

public int compare(Order o1, Order o2) {
try {
if (o1.getBroker().getOrdersPriority() > o2.getBroker().getOrdersPriority())
return 1;
else if (o1.getBroker().getOrdersPriority() < o2.getBroker().getOrdersPriority())
return -1;
else {
if (o1.getBeginDate().before(o2.getBeginDate()))
return 1;
else if (o1.getBeginDate().after(o2.getBeginDate()))
return -1;
else {
if (o1.getBeginTime().before(o2.getBeginTime()))
return 1;
else if (o1.getBeginTime().before(o2.getBeginTime()))
return -1;
else
return 0;
}
}
} catch (NullPointerException e) {
return 0;
}
}

由于某种原因,有时我会收到错误:

java.lang.IllegalArgumentException: Comparison method violates its general contract!

最佳答案

比较器中的实现违反了其一般契约,因为:假设订单 A、B、C 具有相同的经纪商,A 的开始日期为空,B 的开始日期为2017 年 1 月 1 日,C 开始日期为 2018 年 1 月 1 日。然后

    通过比较器
  1. A 等于 B 且A 等于 C。
  2. 通过比较器,B 大于 C

因此 (2) 与 (1) 矛盾。

为了更正实现,删除对 NullPointerException 的捕获(捕获 RunTimeException 的坏习惯),添加比较 Order 属性的方法,并定义 null 的一致比较。

关于java - 比较方法违反了它的一般契约!优先级队列错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43841685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com