我正在将我们的项目升级到 Java 7。我遇到了 Collections.sort() 的非法参数异常。我知道异常的原因是 java 7 中的新 Timsort(我确实抛出了之前在这个问题上提出的所有问题)。现在我需要修改比较逻辑来克服异常。这是我的比较方法
if (o1.isLookup() && !o2.isLookup()) {
return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
return 1;
}
if (o1.dependsOn(o2)) {
return 1;
}
if (o2.dependsOn(o1)) {
return -1;
}
return 0;
我尝试重写 equals() 方法,使用与 compare 相同的逻辑,认为如果 equals 和 compare 返回相同的结果应该可以解决问题;但它没有按预期工作。
当我使用单独的比较器将比较方法拆分为两个时,如下所示,排序(使用两个比较器)不会抛出任何异常。可能是什么原因?
代码如下:
protected Comparator<EntityWrapper> getComparator2() {
return new Comparator<EntityWrapper>() {
public int compare(EntityWrapper o1, EntityWrapper o2) {
if (o1.dependsOn(o2.entityClass)) {
// This depends on otherWrapper
return 1;
}
if (o2.dependsOn(o1.entityClass)) {
// OtherWrapper depends on this
return -1;
}
return 0;
}
};
}
protected Comparator<EntityWrapper> getComparator1() {
return new Comparator<EntityWrapper>() {
public int compare(EntityWrapper o1, EntityWrapper o2) {
if (o1.isLookup() && !o2.isLookup()) {
return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
return 1;
}
return 0;
};
}
最佳答案
你是不是缺少“.entityClass”,例如:
if (o1.isLookup() && !o2.isLookup()) {
return -1;
}
if (!o1.isLookup() && o2.isLookup()) {
return 1;
}
if (o1.dependsOn(o2.entityClass)) {
return 1;
}
if (o2.dependsOn(o1.entityClass)) {
return -1;
}
return 0;
关于Java 7 : java. lang.IllegalArgumentException: 比较方法违反了它的一般契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21030178/