gpt4 book ai didi

哈希表和可比较对象中使用的 Java Null 对象

转载 作者:行者123 更新时间:2023-12-01 12:56:50 25 4
gpt4 key购买 nike

我有一个代表 UNKNOWN 值或“空对象”的对象。

在 SQL 中,这个对象永远不应该等于任何东西,包括另一个 UNKNOWN,所以 (UNKNOWN == UNKNOWN) -> false

然而,该对象在哈希表中使用并且类型是Comparable,所以我创建了一个类如下:

public class Tag implements Comparable {    
final static UNKNOWN = new Tag("UNKNOWN");
String id;

public Tag(String id) {
this.id = id;
}

public int hashCode(){
return id.hashCode();
}

public String toString(){
return id;
}

public boolean equals(Object o){
if (this == UNKNOWN || o == UNKNOWN || o == null || !(o instanceof Tag))
return false;

return this.id.equals(((Tag)o).id);
}

public int compareTo(Tag o){
if (this == UNKNOWN)
return -1;
if (o == UNKNOWN || o == null)
return 1;

return this.id.compareTo(o.id);
}
}

但是现在 compareTo() 似乎“不一致”?

有没有更好的方法来实现compareTo()

最佳答案

compareTo 的文档提到这种情况:

It is strongly recommended, but not strictly required that

(x.compareTo(y)==0) == (x.equals(y))

Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact. The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."

因此,如果您希望您的对象是Comparable,但仍然不允许通过equals 方法使两个UNKNOWN 对象相等,你必须让你的 compareTo “与 equals 不一致。”

一个合适的实现是:

public int compareTo(Tag t) {
return this.id.compareTo(t.id);
}

否则,您可以明确指出UNKNOWN 值尤其不是Comparable:

public static boolean isUnknown(Tag t) {
return t == UNKNOWN || (t != null && "UNKNOWN".equals(t.id));
}

public int compareTo(Tag t) {
if (isUnknown(this) || isUnknown(t)) {
throw new IllegalStateException("UNKNOWN is not Comparable");
}
return this.id.compareTo(t.id);
}

关于哈希表和可比较对象中使用的 Java Null 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43795877/

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