我会创建Set
完全HashSet
,仅包含char
。例如a,b,c,d,e,f,g...
但是这些char
s不是由原始类型表示的,而是我有一个对象
public FirstChar{
private char c;
public FirstChar(char c){
this.c = c;
}
}
现在我想将对象FirstChar
添加到集合中,但为了避免重复的元素,我必须实现HashCode()
和equals()
我知道如何实现equals
但是如何以我在集合中只有一个元素的方式实现hashcode
?
NB。请不要说我使用Eclipse
答案 0 :(得分:3)
编辑:我刚刚看到你的评论,你只需要整个集合中的一个字母 - 这听起来像非常奇怪的要求,但它基本上通过以下方式实现:
public final class FirstChar {
private final char c;
public FirstChar(char c) {
this.c = c;
}
@Override public int hashCode() {
return 0;
}
@Override public boolean equals(Object other) {
return other instanceof FirstChar;
}
}
换句话说,FirstChar
的每个实例都被认为与每个其他实例相同,并且它们都具有相同的哈希码。正如我所说,这真的很奇怪...... 肯定你想要什么?
原始回答
为一个逻辑上只有一个字符的值实现hashCode()
很容易:
@Override
public int hashCode() {
return c; // Use implicit conversion to int
}
检查Object.hashCode
的合同,您会发现这很正常 - 假设您的equals
方法基本上只是比较c
的值。 (当你写“以我在集合中只有一个元素的方式”时,你的意思并不清楚 - 我假设你的意思是每个不同的角色只有一个元素。)
但是,我对FirstChar
课程仅使用java.lang.Character
提供的价值感到困惑。你有什么理由不能使用Set<Character>
吗?
答案 1 :(得分:1)
在任何情况下,据我所知,hashCode
课程中的Character
方法只会将char
作为int
返回。
在您的特定情况下,如果您希望该集只包含添加的第一个FirstChar
,则可以使所有FirstChar
彼此相等:
class FirstChar{
private char c;
public FirstChar(char c){
this.c=c;
}
public String toString(){
return String.valueOf(c);
}
public boolean equals(Object o){
return o instanceof FirstChar;
}
public int hashCode(){
return 42;
}
}
但除非你有充分的理由,否则听起来不是一个好主意。