gpt4 book ai didi

java - compareTo 涉及不可比较字段 : how to maintain transitivity?

转载 作者:行者123 更新时间:2023-11-30 07:22:41 27 4
gpt4 key购买 nike

考虑一个具有可比较字段(与 equals 一致)和不可比较字段(我不知道它是否覆盖 Object#equals 的类)的类。

应比较类的实例,其中结果顺序应与相等一致,即 0 返回 iff 两个字段相等(根据 Object#equals)并与可比字段的顺序一致。我使用 System.identityHashCode 来涵盖这些要求未涵盖的大多数情况(具有相同可比性但其他值不同的实例的顺序是任意的),但不确定这是否是最佳方法.

public class MyClass implements Comparable<MyClass> {
private Integer intField;
private Object nonCompField;

public int compareTo(MyClass other) {
int intFieldComp = this.intField.compareTo(other.intField);
if (intFieldComp != 0)
return intFieldComp;
if (this.nonCompField.equals(other.nonCompField))
return 0;
// ...and now? My current approach:
if (Systems.identityHashCode(this.nonCompField) < Systems.identityHashCode(other.nonCompField))
return -1;
else
return 1;
}
}

我在这里看到两个问题:

  • 如果两个对象的 Systems.identityHashCode 相同,则每个都大于另一个。 (这会发生吗?)
  • 据我了解 Systems. identityHashCode 可以。

这样对吗?还有更多问题吗?最重要的是,有办法解决这个问题吗?

最佳答案

第一个问题虽然不太可能发生,但可能会发生(我认为您需要大量内存,而且运气很差)。但是被Guava的Ordering.arbitrary()解决了,它在后台使用身份哈希码,但会为两个不同对象具有相同身份哈希码的情况维护比较结果的缓存。

关于您的第二个问题,不,身份哈希码不会在运行之间保留。

关于java - compareTo 涉及不可比较字段 : how to maintain transitivity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12515057/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com