1

我会创建一个只包含.for的Set确切内容, 但这些s 不是由原始类型表示的,但我有一个对象HashSetchara,b,c,d,e,f,g...char

public FirstChar{

  private char c;

  public FirstChar(char c){

    this.c = c;

  }
}

现在我想将对象添加FirstChar到一个集合中,但为了避免重复的元素,我必须实现HashCode()equals()

我知道如何实现equals,但我如何才能hashcode以我只能在集合中只有一个元素的方式实现?

注意。请不要说我使用 Eclipse

4

2 回答 2

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. 有什么理由不能只使用 aSet<Character>吗?

于 2011-12-13T15:49:32.310 回答
1

无论如何,据我所知,类hashCode中的方法Character只是charint.

在您的特定情况下,如果您希望集合仅包含FirstChar添加到其中的第一个,则可以使所有FirstChars 彼此相等:

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;
    }
}

但除非你有充分的理由,否则这听起来不是一个好主意。

于 2011-12-13T15:50:24.970 回答