2

問題を投稿するのはこれが初めてです。

私の問題を解決するのを手伝ってください。このコードでは、キーと値のペアを格納するために HasMap を使用しています。

例えば、

String t1 = new String("A B C");
and stored in HashMap as-

m.put(t1,27);

ここで、A、B、C は 3 つの異なる文字列です。A、B、C のさまざまな組み合わせが一意であると想定される場合。

Like "A B C", "B A C", "C B A" are all treated as equal.

このために hashCode() と equal() を実装しました。以下のコードは出力のみです

A B C:61046662

しかし、hashCode() や equals() を呼び出していません。何か提案をください。

public class Test {
public int hashCode(){
    System.out.println("hashcode method called");
    return this.toString().length();    
}

public boolean equals(Object obj) {
    System.out.println("equal method called ");
    int count = 0;
    if(!(obj instanceof String))
        return false;
    if (obj == this)
        return true;
    count = 0;
    StringTokenizer st = new StringTokenizer(((String)obj).toString(), " ");
    while(st.hasMoreTokens()){
        if(this.toString().contains(st.nextToken())){
            count ++;
        }
    }
    return (count == 3);
}

public static void main(String[] args) {

    HashMap<String, Integer> m = new HashMap<String, Integer>();

    String t1 = new String("A B C");
    String t2 = new String("B A C");
    String t3 = new String("C B A");

    m.put(t1, 27);
    m.put(t2, 34);
    m.put(t3, 45);

    System.out.println(m.get("A B C"));

    for(Entry e : m.entrySet()){
        System.out.println(((String)e.getKey())+":" +e.getKey().hashCode());
    }
}
}
4

2 に答える 2

3

マップ キーは typeではなくtype であるため、メソッドequals()hashCode()メソッドは関係ありません。したがって、標準の文字列比較とハッシュコードが使用されています。StringTest

Test文字列を保持するように変更し、それにequals()応じて変更する必要がありますhashCode()。次に、マップのタイプを に変更する必要がありますHashMap<Test,Integer>

于 2013-10-16T09:54:23.193 に答える
0

キーの hashCode は、キーの位置と一意性を決定するために使用されます。String オブジェクトをマップに追加しているので、String.hashCode メソッドが使用されます。Test クラスに hashCode を実装しましたが、これらは使用されません。

問題を解決するには、独自の hashCode 実装を使用して、キーとして使用される独自のクラスを作成します。あなたの例を使用して、文字列を保持できる Test クラスにプロパティを追加し、マップのキーとして Test クラスを使用します。

于 2013-10-16T09:57:52.083 に答える