另一种违反合同的比较方法

时间:2016-03-04 22:18:10

标签: java exception java-8 java-stream comparator

我上过这堂课:

result = np.abs(b[:, None] - a[None, :])

在我看来,class Column implements Comparable<Column> { private final float startX; private final float endX; public Column(float startX, float endX) { this.startX = startX; this.endX = endX; } public boolean isSameColumn(Column c) { return c.startX <= this.startX && this.startX < c.endX || this.startX <= c.startX && c.startX < this.endX; } @Override public int hashCode() { return Objects.hash(startX, endX); } @Override public boolean equals(Object obj) { if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Column other = (Column) obj; return this.startX == other.startX && this.endX == other.endX; } @Override public int compareTo(Column o) { return isSameColumn(o) ? 0 : Float.compare(this.startX, o.startX); } } 方法符合比较器合同,即使它与compareTo(故意)不一致 - 根据{{3}这不应该是一个问题}:

  

通常情况如此,但并非严格要求equals

但是,我有时会得到:

(compare(x, y)==0) == (x.equals(y))

例如,下面的代码抛出一个异常(同样在the javadoc - 它有点长,但大部分都是测试数据)。

另请注意,在流中java.lang.IllegalArgumentException: Comparison method violates its general contract! 之前运行sorted()可解决问题。

distinct()

2 个答案:

答案 0 :(得分:8)

我不认为你的比较物是可传递的,即columnA(1, 4), columnB(3, 7), columnC(6, 9)

在这种情况下,columnA.compareTo(columnB) = 0columnB.compareTo(columnC) = 0columnA.compareTo(columnC) < 0

至于sorted()出现在distinct()之前失败的原因,谁知道当compareTo()不可传递时会发生什么?

答案 1 :(得分:1)

好吧,我想我可能已经找到了这个问题,但不知道如何解决它。 问题是比较器不是传递性的。其他人也注意到这一点,我也在问题的评论中也这样做了。

如果从这里交换Float.compare的值:

return isSameColumn(o) ? 0 : Float.compare(this.startX, o.startX);

到此:

return isSameColumn(o) ? 0 : Float.compare(o.startX, this.startX);

排序工作没有问题,但这给出了相反的顺序。

现在我的理由仍然不完全清楚,但我希望这能让你在正确的方向上轻推。