gpt4 book ai didi

java - 比较器总契约(Contract)违约

转载 作者:行者123 更新时间:2023-11-29 06:53:12 26 4
gpt4 key购买 nike

我已经阅读了所有关于传递比较器的帖子,我不明白为什么这个比较器函数违反了规则。如果有人能清洁我的眼睛,我想这很简单,但我做不到

堆栈是:

java.util.TimSort.mergeLo(TimSort.java:747)
java.util.TimSort.mergeAt(TimSort.java:483)
java.util.TimSort.mergeCollapse(TimSort.java:410)

我的对象(简体)

public class SleepDetails  {
private DateTime time;
private SleepEnum type;
[...]
}

public enum SleepEnum {
DEEP(0), LIGHT(1), AWAKE(2), BEGIN(16), END(17);
[...]
}

比较器一个静态的变成一个类

Comparator<SleepDetails> comparator = new Comparator<SleepDetails>(){
public int compare(SleepDetails arg0, SleepDetails arg1) {
int res = arg0.getTime().compareTo(arg1.getTime());
if (res != 0)
return res;
if (arg0.getType() == arg1.getType())
return 0;
switch(arg0.getType()) {
case BEGIN:
return -1;
case END:
return 1;
default:
return 0;
}
}
};

主要是我想按日期对事件进行排序,以防两个具有相同日期时间的事件将开始事件放在最前面,结束事件放在最后。

我没有触发错误的集合

最佳答案

如果您比较两个具有相同 getTime()SleepDetails 实例,其中一个实例具有 getType() BEGIN,另一个具有 AWAKE .

compare (one, two)

会给出-1

同时

compare (two, one)

会给出 0

这违反了契约(Contract):

The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y.

您还必须检查 compare 方法中的 arg1.getType()(只要 arg0.getType() 既不是 BEGIN 也不是 END) .

    public int compare(SleepDetails arg0, SleepDetails arg1) {
int res = arg0.getTime().compareTo(arg1.getTime());
if (res != 0)
return res;
if (arg0.getType() == arg1.getType())
return 0;
switch(arg0.getType()) {
case BEGIN:
return -1;
case END:
return 1;
default:
switch(arg1.getType()) {
case BEGIN:
return 1;
case END:
return -1;
default:
return 0;
}
}
}

关于java - 比较器总契约(Contract)违约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41017666/

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