2012-05-09 15 views
2

キーが整数の配列であるHashMapを作成できますか?複数の値を持つキーを持つHas​​hMap

私はPythonを使用するのに慣れていて、最近はJavaで作業を始めました。私の仕事では、

map.put([5,2], 1); 
map.put([3,2], 0); 

などのようなキーを使ってHashMapを作成する必要があります。私は後でそれらの数字のペアがマップに存在する場合はそれを使用しています。もしそうなら、何かを行い、そうでなければ続行します。私は次のことを試してみました、そうするには

Map<Array, Boolean> test = new HashMap<Array, Boolean>(); 
int[] a1 = {5,2}; 
test.put(a1, true); 

Eclipseは( "引数は[] int型には適用されません...")メッセージが表示されます。しかし、私がやった設定は何らかのエラーが出ます。

Map内のオブジェクト、HashMapのネストされたオブジェクトなどを使ってみましたが、どれもうまくいきませんでした(Pythonでは非常に簡単ですが、私はdict [(5,2)] = 1と書いています) Javaの場合は、そのような単純なものがあります)。私は文字列に数値を変換するなど、その後の間にコロンを追加することが示唆された。

map.put("5:2", 1); 

と後で私は再び文字列を破るが、これは解決策がある場合は - 私は戻ってのPythonに行く;)!!

おそらくこれは非常に単純な質問ですが、私は答えを見つけることができませんでした。あなたが私を助けてくれることを願っています。

ありがとうございます!

+1

マップにキーとして2つの整数が必要な場合は、2つの整数とハッシュ関数で独自のクラスを作成し、そのクラスのインスタンスをキーとして使用するのが最適なソリューションです。 – MTilsted

答えて

2

HashSetである私は上記の行っているよう

final Set<List<Integer>> population; 

population = new HashSet<List<Integer>>(); 
population.add(Arrays.asList(1, 2)); 

if (population.contains(Arrays.asList(1, 2))) 
{ 
    ... 
} 

あなたはListを使用することができます - 。それdoesnのすべてのリストが厳密に2つの要素であることを保証するものではありません(それが実際に制約である場合)。これを少し頑強にするために、独自のクラスを作成してタプルを表現することができます。 hashCode()article explaining good practice

Arrays.asList()は、コード内でインラインでリストを作成するのに便利です。より一般的なリストはArrayListです。

+0

素晴らしい!答えは大変ありがとうございます!まあ私はこれを試して、かなりうまくいった。私はまだequals()とhashCode()を実装する必要があるのはなぜか分かりませんが、確かにそれを勉強します! Tnx =)!! –

+0

ハッシュデータ構造( 'HashSet'、' HashMap')では、オブジェクトをバケットに分散するために 'hashCode()'が使われます。 'equals()'は、実際にオブジェクトが衝突をハッシュしたときに要求されたものであることを保証するために使用されます。したがって、両方とも実装されなければならず、オブジェクトが等しい場合、それらは同じものを動作させるためには等しいハッシュコードを持たなければならないという規則に従わなければならない。 –

0

実際、javaはPythonより表現力があまりよくないので、もう少しコードを書く必要があります。

私はあなたが次のようにArrayListでマップを使用する必要があると思う:(あなたが尋ねたとして)

ArrayList al = map.get("key"); 
if (al == null) { 
    al = new ArrayList(); 
    map.put("key", al) 
} 
al.add(some_object); 

また、おそらくあなたは不変の配列をしたい、キーとして配列を使用することができます。ハッシュマップのキーは、equalshashCodeの実装が良いオブジェクトを使用することです。

これはjavaで行われる方法ですが、コレクションはどのような種類のコレクションでも使用できますが、もっと一般的です。

乾杯!あなたは、エントリのexistanceをチェックしたい場合は、あなたがSet(有益な具体的な実装を使用することができます

1

これは動作します:

Map<List<Integer>,Boolean> map = new HashMap<>(); 
map.put(Arrays.asList(new Integer(1), new Integer(2)), false); 
map.put(Arrays.asList(4, 5), true); // Integer type is inferred and ints are autoboxed 

map.get(Arrays.asList(1, 2)); // gets the Boolean object for "false" 
2

を最も簡単な方法は、Map<List<Integer>, Boolean>だろう - あなたはできるだけ多くのキーがあるかどうかなどの値を気にしないので、あるいは単にSet<List<Integer>>、。

複数のJava-Yの溶液が2つのintを表すいくつかのクラスであろう:

public class Coordinate { // or whatever 
    private final int x; 
    private final int y; 

    // constructor and overrides for equals, hashCode and toString 
} 

次にSet<Coordinate>を有します。

これは、クラス名が正確にこのセットが何であるかを伝え、それがそのように使用されることを強制するため、より慣習的にJavaと見なされます。一方で、Set<List<Integer>>は、座標、宝くじピッキング、所与の部門の人々のためのSSN、支払いのためのクレジットカードなど、多くのことがあります。プログラマーはタイプを見るだけでは知ることができません。物事を意味する数字の集合が別の文脈で誤って使われるのは簡単です。 Set<Coordinate>は、座標セット以外のものであってはなりません。

+0

私は同意します。セットは素晴らしいオブジェクト指向のソリューションです –