【发布时间】:2018-12-02 00:23:14
【问题描述】:
我正在将我们的项目升级到 java 7。我遇到了 Collections.sort() 的 Illegal Argument 异常。我知道异常的原因是 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() 方法,认为如果 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;
};
}
【问题讨论】:
-
有没有可能
o1.dependsOn(o2)和o2.dependsOn(o1)都是真的? -
除非我们看到
dependsOn和isLookup方法在这里做了什么,否则很难评论。 -
不能代表您的具体示例,但请确保您的比较函数尊重严格弱排序的概念。也就是说,如果 a a 和类似的东西。
-
@Henry 可能会针对您的具体情况确定它。如果 o1 和 o2 都相互依赖,如果使用 (o1, o2) 调用,比较器将返回 o1 大于 o2,但如果使用 (o2, o1) 调用,比较器将返回 o2 更大,这完全混淆了排序算法.
-
张贴SSCCE 清楚地显示问题。