HashMapのキーに対応する複数の値を保持することは可能ですか?はいの場合、どのように?
6 に答える
はい、これは連鎖と呼ばれます。特にチェーンのサイズが大きくなり始めた場合は、できるだけチェーンを避けたいと思うでしょう。目標は可能な限り O(1) に近づけることであるため、より長いチェーン サイズはハッシュ構造を使用する目的全体に反します。
Map<String, List<String>> hm = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
values.add("Value 1");
values.add("Value 2");
hm.put("Key1", values);
Guava ライブラリ(以前の Google コレクション)を試すことができます。単一のキーに対して複数の値を格納できるマルチマップの実装があります。
たとえば、ListMultimap の実装では、キーと値のペアの複製が許可され、挿入順に保持されます。
使用方法は次のとおりです。
ListMultimap<String, Integer> numberClasses = ArrayListMultimap.create();
numberClasses.put("odd", 1);
numberClasses.put("odd", 3);
numberClasses.put("odd", 5);
numberClasses.put("even", 2);
numberClasses.put("even", 4);
numberClasses.put("even", 6);
assertEquals(Arrays.asList(1,3,5), numberClasses.get("odd"));
assertEquals(Arrays.asList(2,4,6), numberClasses.get("even"));
もう 1 つのクールな例はSetMultimap です。これは、キーの値がセットに保持されることを除いて、ListMultimap と非常によく似ています。(ユーザーの観点からは、それがどのように実装されているか正確にはわかりません。)
SetMultimap<String, Integer> setMultimap= HashMultimap.create();
setMultimap.put("key1", 1);
setMultimap.put("key1", 1);
setMultimap.put("key1", 1);
setMultimap.put("key1", 2);
setMultimap.put("key2", 1);
setMultimap.put("key2", 3);
assertEquals(ImmutableSet.of(1,2), setMultimap.get("key1"));
assertEquals(ImmutableSet.of(1,3), setMultimap.get("key2"));
を使用しMap<String, List<String>>
ます。
厳密に言えば、いいえ。
しかし!何らかの値として、Collection
それを使用して、必要な数の値を格納できます。
Without using any other Libary Create a map with Key as String and value as HashSet value will be not repeated string.
multivaleMap.computeIfAbsent("key", k -> new HashSet<String>()).add("value1");
multivaleMap.computeIfAbsent("key", k -> new HashSet<String>()).add("value2");
System.out.println(multivaleMap);``` will print {key=[value2, value1]}
はい。ただし、格納されている値の型がMap
配列またはリストの場合のみ:
Map<String, List<String>> myMap
また
Map<String, String[]> myMap
しかし、汎用データ構造内に汎用データ構造を構築することは一般的に悪い習慣です。
をラップするドメイン固有のクラスをHashMap
作成して、値の存在やキーごとの項目数などを簡単に確認できないようにするにはどうすればよいでしょうか?