1

たとえば、 .forSetのみHashSetを含むものを作成します が、これらはプリミティブ型で表されませんが、オブジェクトがありますchara,b,c,d,e,f,g...char

public FirstChar{

  private char c;

  public FirstChar(char c){

    this.c = c;

  }
}

今、私はオブジェクトをセットに追加したいのですFirstCharが、繰り返し要素を避けるために実装HashCode()しなければなりませんequals()

実装方法は知っていますが、セットに要素を 1 つしか持たないように実装するにはequalsどうすればよいですか?hashcode

注意。Eclipse を使うように言わないでください

4

2 に答える 2

3

編集:セット全体で1文字だけが必要だというあなたのコメントを読みました-これは非常に奇妙な要件のように聞こえますが、基本的には次のようなもので満たされます:

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他のすべてのインスタンスと等しいと見なされ、それらはすべて同じハッシュ コードを持ちます。私が言うように、これは本当に奇妙です.それは本当にあなたが望むものですか?


元の答え

論理的に 1 文字しか持たない値の実装hashCode()は簡単です。

@Override
public int hashCode() {
    return c; // Use implicit conversion to int
}

のコントラクトを確認すると、Object.hashCodeこれが正常に機能することがわかります。equalsメソッドが基本的に の値を比較するだけであると仮定しますc。(「セット内に要素を 1 つだけ持つことができる方法で」と書いたときの意味は明確ではありません。異なる文字ごとに 1 つの要素のみを意味していると思います。)

FirstCharただし、を使用するだけでクラスが提供する価値については混乱していますjava.lang.Character。だけを使用できない理由はありますSet<Character>か?

于 2011-12-13T15:49:32.310 に答える
1

いずれにせよ、私が知る限り、クラスのhashCodeメソッドは単純にを として返します。Charactercharint

FirstChar特定のケースで、セットに最初に追加されたもののみを含める場合は、すべてFirstCharの s を互いに等しくすることができます。

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 に答える