多数のキー値ペアを持つMap<String,String>
があります。次に、そのMap
から選択したキーを削除します。次のコードは、それを達成するために私がしたことを示しています。
Set keySet = new HashSet(); //I added keys to keySet which I want to remove.
それから:
Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
map.remove( entriesIterator.next().toString());
}
これは機能しています。私が知りたいのですが、私の要件を達成するためのより良い方法は何ですか?
削除する文字列がセットに含まれていると仮定すると、 keySet
メソッド およびmap.keySet().removeAll(keySet);
を使用できます。
keySet
は、このマップに含まれるキーのSetビューを返します。セットはマップに連動しているため、マップへの変更はセットに反映され、その逆も同様です。
考案された例:
Map<String, String> map = new HashMap<>();
map.put("a", "");
map.put("b", "");
map.put("c", "");
Set<String> set = new HashSet<> ();
set.add("a");
set.add("b");
map.keySet().removeAll(set);
System.out.println(map); //only contains "c"
完全を期すために:
推測されるように、Java.util.AbstractSet#removeAll
はすべてのエントリを実際に繰り返しますが、ちょっとしたトリックがあります。小さなコレクションの反復子を使用します。
if (size() <= collection.size()) {
Iterator<?> it = iterator();
while (it.hasNext()) {
if (collection.contains(it.next())) {
it.remove();
}
}
} else {
Iterator<?> it = collection.iterator();
while (it.hasNext()) {
remove(it.next());
}
}