如果我调用这行代码
Arrays.sort(allNew, 0, sizeNew, mCatBPosComparator);
与那个比较器
private class BPosComparator implements Comparator<CatBPos> {
private static final int SWAP_BPosS = 1;
@Override
public int compare(CatBPos p1, CatBPos p2) {
int lCompare;
if (TimeUtils.isNotVoid(p1.getHdopBPos().getTime()) && TimeUtils.isNotVoid(p2.getHdopBPos().getTime())) {
lCompare = p1.getHdopBPos().getTime().compareTo(p2.getHdopBPos().getTime());
if (lCompare != 0) {
return lCompare;
}
}
lCompare = p1.getBPos().getTime().compareTo(p2.getBPos().getTime());
if (lCompare != 0) {
return lCompare;
}
if (p1.getBPos().isDeparture() && p2.getBPos().isVacation()) {
return SWAP_BPOS;
} else if (p1.getBPos().isVacation() && p2.getBPos().isArrival()) {
return SWAP_BPOS;
}
// Ankunft und Abfahrt für denselben Bahnhof sollen in der richtigen Reihenfolge sein
if (p1.getBPos().isDeparture() && p2.getBPos().isArrival() && p1.getBPos().getStat().equals(p2.getBPos().getStat())) {
return SWAP_BPOS;
}
return 0;
}
}
我遇到了那个异常:
Comparison method violates its general contract!
我看到很多关于这个的话题。但我不明白。 你能帮帮我吗?
最佳答案
我怀疑这至少是一个迫在眉睫的问题:
if (p1.getBPos().isDeparture() && p2.getBPos().isVacation()) {
return SWAP_BPOS;
} else if (p1.getBPos().isVacation() && p2.getBPos().isDeparture()) {
return SWAP_BPOS;
}
如果你调用 compare(p1, p2)
然后调用 compare(p2, p1)
你会得到相同的非零结果...这打破了比较规则。
基本上,您的比较需要遵守 documented rules .以上是一个问题 - 完全有可能还有更多问题。您应该非常仔细地阅读规则并思考您的比较需要如何进行。
对于相反的情况,您可以通过否定 SWAP_BPOS
开始:
if (p1.getBPos().isDeparture() && p2.getBPos().isVacation()) {
return SWAP_BPOS;
} else if (p1.getBPos().isVacation() && p2.getBPos().isDeparture()) {
return -SWAP_BPOS;
}
这可能不是所需的一切,但这是一个开始。
关于java - 为什么我得到 "Comparison method violates its general contract",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22768302/