【发布时间】:2011-10-21 12:42:18
【问题描述】:
我知道这个问题已经有一段时间了,并检查了我能得到的所有以前的答案,但这个仍然不起作用。
对象“船员”代表具有等级和其他物品的船员。比较应该通过比较'assigned_rank',一个int值,如果这个值在两个实例中相等,那么'is_trainer',一个布尔值,应该会有所不同。
只要在 java
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(ComparableTimSort.java:714)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:451)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:376)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:182)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at dormas_flightlog.Query.getCrew(Query.java:714)
这里是来源,其中一些潜在危险的部分已经被注释掉了,但它仍然不起作用:
public class crew implements Serializable, Comparable<crew> {
private static final long serialVersionUID = 36L;
private int flightID = 0;
private int assigned_rank = 25;
private boolean is_trainer = false;
...
@Override
public int compareTo(crew him) {
int myRank = this.getAssigned_rank();
int hisRank = him.assigned_rank;
if (this == him) {
return 0;
}
if (myRank > hisRank) {
return 1;
}
if (myRank < hisRank) {
return -1;
}
if (myRank == hisRank) {
// if (is_trainer && !o.is_trainer) {
// i = 1;
// }
// if (!is_trainer && o.is_trainer) {
// i = -1;
// }
// if (is_trainer && o.is_trainer) {
// i = 0;
// }
// if (!is_trainer && !o.is_trainer) {
// i = 0;
// }
return 0;
}
return 0;
}
@Override
public int hashCode() {
int hash = 7;
hash = 31 * hash + this.assigned_rank;
hash = 31 * hash + (this.is_trainer ? 1 : 0);
return hash;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
int myRank = this.getAssigned_rank();
int hisRank = 0;
if (o instanceof crew) {
crew him = (crew) o;
hisRank = him.assigned_rank;
} else {
return false;
}
if (myRank > hisRank) {
return false;
}
if (myRank < hisRank) {
return false;
}
if (myRank == hisRank) {
// if (is_trainer && !o.is_trainer) {
// i = 1;
// }
// if (!is_trainer && o.is_trainer) {
// i = -1;
// }
// if (is_trainer && o.is_trainer) {
// i = 0;
// }
// if (!is_trainer && !o.is_trainer) {
// i = 0;
// }
return true;
}
return false;
}
}
实现 equals() 只是为了解决这个问题。给定的异常带有或不带有 equals()。我看不到 compareTo 方法是如何违反其合同的。非常感谢任何帮助......有一天这段代码必须与java 7一起使用,我不知道如何...... 谢谢
【问题讨论】:
-
你能显示你正在排序的代码吗?
-
那么assigned_rank和getAssigned_rank()有什么区别?
-
类似问题问here
-
你有没有找到真正的解决方案(除了像 naresh 建议的那样抑制警告)?在我的案例中,我遇到了类似代码的相同问题。我开始认为这是库代码中的错误。
-
您的代码看起来不错。您是否有一些发生这种情况的示例对象(或者最好是整个最小示例)?