java - 为什么我得到 "Comparison method violates its general contract"

标签 java comparator

如果我调用这行代码

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/

相关文章:

java - 可能损坏的 java.util.Locale 导致 NullPointerException

java - 使用比较器对列表进行排序后数字精度会丢失

Java:TreeSet 和 LinkedList 的问题

ruby-on-rails - Rails Rspec 整数等于字符串 ("1"== 1)

java - 在嵌套类中实现的比较器接口(interface)

java - 是否有带有自定义比较器的 retainAll() 的实现?

java - 使用 Java 访问 URL

Java 的 CORBA ORB 并连接到第 3 方命名服务

java - 在这个 scala 示例中同步是如何工作的?

java - 无法安装 Magnolia 数据模块(版本 2.3.0)