2

キーが整数の配列である HashMap を作成することは可能ですか?

私は Python の使用に慣れていて、つい最近 Java を使い始めました。私の仕事では、次のようなキーで HashMap を作成する必要があります。

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

等々。これらの数値のペアがマップに存在するかどうかを後でテストするために使用しています。存在する場合は何かを行い、存在しない場合は続行します。

そのために、次のことを試しました。

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

Eclipse からメッセージが表示されます (「引数は int[]... には適用されません」)。しかし、私が行った構成では、エラーが発生します。

ArrayList、マップ内のオブジェクト、ネストされた HashMap などを使用してみましたが、どれも機能しませんでした (python では非常に簡単です。dict[(5,2)] = 1 と書くだけなので、Java で想像してみてください)そのような単純なものです)。次のように、数値を文字列に変換し、その間にコロンを追加するよう提案されました。

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

その後、再び文字列を壊しますが、これが解決策である場合は、Python に戻ります ;)!!

おそらくこれは非常に簡単な質問ですが、答えが見つかりませんでした。助けていただければ幸いです。

前もって感謝します!

4

4 に答える 4

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と見なされます。一方、 ASet<List<Integer>>は、座標、宝くじの選択、特定の部門の人々のSSN、支払い用のクレジットカードなど、さまざまなものになる可能性があります。プログラマーは、タイプを見ただけではわかりません。物事を意味する一連の数字が別のコンテキストで誤って使用されるのは簡単です。ASet<Coordinate>は、座標のセット以外のものにすることはできません。

于 2012-05-09T03:43:58.110 に答える
2

エントリの存在を確認したい場合は、を使用できますSet(便利な具体的な実装はHashSet.

final Set<List<Integer>> population;

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

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

上で行ったようにan を使用できますがList、すべてのリストが正確に 2 要素の長さであることを保証するものではありません (それが実際に制約である場合)。もう少し堅牢にするために、タプルを表す独自のクラスを作成できます。その場合は、必ず and を実装equals()してくださいhashCode()(こちらの記事で、優れた実践方法を説明しています)。

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

于 2012-05-09T03:34:28.927 に答える
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"
于 2012-05-09T03:36:18.770 に答える
0

実際、java は python よりも表現力が低いため、もう少しコードを書く必要があります。

ArrayList次の方法でマップを使用する必要があると思います。

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

配列をキーとして使用することもできます (要求したとおり)。おそらく、不変の配列が必要です。equalsハッシュ マップが機能するための鍵は、との適切な実装を持つオブジェクトを使用することhashCodeです。

これは Java で行われる方法ですが、任意の種類のコレクションを使用できますが、セットの方が一般的です。

乾杯!

于 2012-05-09T03:32:40.007 に答える