2013-07-16 8 views
80

私はMap<String,String>に多数のキー値のペアを持っています。今度は、Mapから選択したキーを削除します。次のコードは、私が達成したことを示しています。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()); 
} 

これが働いています。私はただ知りたい、私の要件を達成するためのよりよい方法は何ですか?

答えて

161

あなたのセットに削除する文字列が含まれていると仮定すると、the keySet methodmap.keySet().removeAll(keySet);を使用できます。

keySetは、このマップに含まれるキーのセットビューを返します。セットはマップによってサポートされているため、マップの変更はセットに反映され、その逆もあります。

不自然な例:ちょうど完全を期すため

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" 
+0

あなたの提案は素晴らしいです。私はremoveAll(keySet)が私がそこで何をやったのかと思う –

+8

"効率"という言葉はおそらくちょうどループの下にありますが、クリーナーコードの面では、素敵な勝利です:) – rogerdpack

+0

thaks、私はretainAll – shareef

1

としてはなく、一つの小さなトリックで、すべてのエントリの上に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()); 
    } 
} 
関連する問題