値は最初は null になるため、キーを初めて使用するときは初期化する必要があることに注意してください。
Map<String,Set<Integer>> map;
キーに番号を追加するには、次の操作を行う必要があります。
String key = "apple"; // for example
Set<Integer> set = map.get(key);
if (set == null) {
set = new HashSet<Integer>();
map.put(key, set);
}
set.add(5);
残念ながら、セットを操作するすべての場所で、null チェックを行う必要があります。たとえば、特定のキーに特定の番号がマップされているかどうかを確認したい場合、これを安全に行うことはできません。
if (map.get(key).contains(number)) // not safe
への呼び出しget()
が返される可能性がnull
あり (キーのエントリがない場合) NullPointerException
、.
マップ内の null チェックを内部化することで、マップを非常に便利に使用できるようにする方法がありますget()
。get()
それに応じてオーバーライドする匿名クラスを作成します。
Map<String,Set<Integer>> map = new HashMap<String,Set<Integer>> () {
@Override
public Set<Integer> get(Object key) {
Set<Integer> set = super.get(key);
if (set == null) {
set = new HashSet<Integer>();
put(key, set);
}
return set;
}
}
これにより、メイン コードがよりシンプルで明確になります。たす:
map.get(key).add(number);
チェックする:
if (map.get(key).contains(number)) // now safe
null チェック コードは不要になりました。
——</p>
Java 8 の更新:
セットに追加するときの null エントリの問題に対処するには:
map.computeIfAbsent( key, k -> new HashSet<>() ).add(number);
nullセーフチェックの場合:
if ( map.getOrDefault(key, Collections.emptySet() ).contains(number))