効率的な方法でマップから複数のキーを削除しますか?


123

私が持っている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());
} 

これは機能しています。私は知りたいだけです、私の要件を達成するためのより良い方法は何でしょうか?

回答:


240

セットに削除する文字列が含まれていると仮定するとkeySetメソッド andを使用できます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"

あなたの提案は素晴らしいです。removeAll(keySet)が私がそこで行ったことを実行していると思います
Ruchira Gayan Ranaweera 2013

11
「効率」に関しては、おそらくforループの下にあるだけですが、よりクリーンなコードに関しては、すばらしい勝利です:)
rogerdpack

3

完全を期すために:

推測したとおりjava.util.AbstractSet#removeAll、すべてのエントリを反復処理しますが、小さなトリックが1つあります。これは、小さいコレクションの反復子を使用します。

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());
    }
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.