2

特定のクラスをキーにしたマップを作成したい。私が遭遇した問題は、このクラスにはポインターが含まれているため、HashMap を使用するとハッシュするときにこのアドレスが使用されることです (以下のコードを参照)。アドレスではなく実際の値を比較するにはどうすればよいですか、または同じ結果を達成するために使用できる他のコンテナがありますか?

import java.util.*;
public class Main {
    public static void main(String args[]) {
        class Foo {
            public Foo(String a) {s = a;}
            public String s;
        }

        HashMap<Foo,Integer> a = new HashMap<Foo,Integer>();
        a.put(new Foo("test"), 1);
        System.out.println(a.get(new Foo("test")));
    }
}

これは出力しますnull

4

2 に答える 2

9

クラスのインスタンスをキーとして使用するには、そのクラスとメソッドHashMapをオーバーライドする必要があります。これを行うと、すべてが正常に機能するはずです。hashCodeequals

class Foo {
    public Foo(String a) {s = a;}
    public String s;
    int hashCode() {return s.hashCode();}
    boolean equals(Object other) {
        if (other == this) return true;
        if (!(other instanceof Foo)) return false;
        return ((Foo)other).s.equals(s);
    }
}
于 2012-05-28T01:40:21.937 に答える
1

クラスをキーとしてパラメータ化するのMapではなく、クラスのインスタンスをパラメータ化していることに注意してください。マップの型パラメーターとしてクラスを使用していた場合、次のようになります。Foo

Map<Class<Foo>,Integer> map;

のインスタンスを操作するためにマップが必要な場合は、上記がコードには当てはまらないことを理解してくださいFoo

Map<Foo,Integer> map;

... 次に、との両方Fooをオーバーライドして、すべてが正常に機能するようにする必要があります。これは、両方のメソッドをオーバーライドする方法を説明する素晴らしい記事です。 equals()hashCode()

于 2012-05-28T01:45:09.080 に答える