我上过这堂课:
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()
答案 0 :(得分:8)
我不认为你的比较物是可传递的,即columnA(1, 4), columnB(3, 7), columnC(6, 9)
。
在这种情况下,columnA.compareTo(columnB) = 0
和columnB.compareTo(columnC) = 0
,columnA.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);
排序工作没有问题,但这给出了相反的顺序。
现在我的理由仍然不完全清楚,但我希望这能让你在正确的方向上轻推。