Java 比较国一般合同违约
我已经阅读了所有关于可传递比较器的线程,我不明白为什么这个比较器函数违反了规则。如果有人能清洁我的眼睛,我想这很简单,但我无法做到 堆栈是:Java 比较国一般合同违约,java,sorting,collections,Java,Sorting,Collections,我已经阅读了所有关于可传递比较器的线程,我不明白为什么这个比较器函数违反了规则。如果有人能清洁我的眼睛,我想这很简单,但我无法做到 堆栈是: java.util.TimSort.mergeLo(TimSort.java:747) java.util.TimSort.mergeAt(TimSort.java:483) java.util.TimSort.mergeCollapse(TimSort.java:410) 我的目标简化了 public class SleepDetails {
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;
}
}
};
我主要想按日期对事件进行排序,如果两个事件的日期时间相同,则将begin事件放在第一位,将end事件放在最后一位
如果比较两个具有相同getTime的SleepDetails实例,其中一个具有getType BEGIN,另一个具有AWAKE,则我没有触发错误的集合
compare (one, two)
将给出-1
当
compare (two, one)
将给出0
这违反了合同:
实现者必须确保所有x和y的sgncomparex,y==-sgncomparey,x
每当arg0.getType既不是开始也不是结束时,还必须在比较方法中检查arg1.getType
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;
}
}
}
如果比较两个具有相同getTime的SleepDetails实例,其中一个具有getType BEGIN,另一个具有唤醒
compare (one, two)
将给出-1
当
compare (two, one)
将给出0
这违反了合同:
实现者必须确保所有x和y的sgncomparex,y==-sgncomparey,x
每当arg0.getType既不是开始也不是结束时,还必须在比较方法中检查arg1.getType
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;
}
}
}
问题在于,代码没有区分除BEGIN和END之外的类型的枚举值。特别是,当第一个类型既不是BEGIN也不是END时,不管第二个类型是什么,它都返回零 但是,这种行为是不对称的:如果您交换一对中的两个项BEGIN和LIGHT,您将得到-1和0,从而破坏对称性
您可以将除BEGIN和END之外的所有类型视为彼此相等,但在确定相等性时,您需要使用两边。问题在于,您的代码没有区分BEGIN和END之外的类型的枚举值。特别是,当第一个类型既不是BEGIN也不是END时,不管第二个类型是什么,它都返回零 但是,这种行为是不对称的:如果您交换一对中的两个项BEGIN和LIGHT,您将得到-1和0,从而破坏对称性
您可以将除BEGIN和END之外的所有类型视为彼此相等,但在确定相等时,您需要使用两边。switcharg0.getType-您没有进行比较。呃@Bene什么?类似的方法肯定不会遵循这一点。整数。比较1,2!=整数。比较2,1。事实上,它们只有在相同的情况下才是匹配的。我糟糕的,不同的storyswitcharg0.getType-你不是在比较。呃@Bene什么?类似的方法肯定不会遵循这一点。整数。比较1,2!=整数。比较2,1。事实上,只有当他们是一样的时候,他们才是匹配的。我的糟糕,不同的故事