web-dev-qa-db-ja.com

特定の値のすべてのアイテムをハッシュマップから削除する

だから私は以下のようなJavaハッシュマップを持っています:

hMap.put("1", "One");
hMap.put("2", "Two");
hMap.put("3", "Two");

値が「2」のアイテムをすべて削除したい

私が次のようなことをした場合:

hmap.values().remove("Two");

最初のものだけが削除されます。すべて削除したいのですが、どうすればよいですか?

18
Anthony Webb

hmap.values().removeAll(Collections.singleton("Two"));

EDIT:この簡潔なアプローチの(重要な)欠点は、基本的にコメントを強制されることです。

// remove("Two") would only remove the first one

そうでなければ、善意のあるエンジニアがいつかあなたのためにそれを単純化して壊そうとします。これは起こります...時々善意の善良な人は未来のあなたでさえあります!

44

In Java 8

hmap.values().removeIf(val -> "Two".equals(val));
22
Greg Anders
for (Iterator<Map.Entry<String,String>> it = hMap.entrySet().iterator(); it.hasNext();) {
 Map.Entry<String,String> e = it.next();
 if ("Two".equals(e.getValue())) {
  it.remove();
 }
}

15
Ron

呼び出しの結果としてコレクションが変更された場合、remove呼び出しはtrueを返すため、while( hmap.values().remove("Two") );を使用できます。

10
sgtFloyd

(削除された値をログに記録するための更新されたソリューション)

このソリューションは、google-collectionsライブラリを使用します[ [〜#〜] link [〜#〜] ]

import static com.google.common.collect.Maps.filterValues;
import static com.google.common.base.Predicates.equalTo;

...

Map<String, String> removedValues = filterValues(hMap, equalTo("Two"));      
System.out.println(removedValues); //Log Removed Values
removedValues.clear(); //Removes from original map, since this is a view.

注-このソリューションは、filterValues呼び出しによって返されるマップが元のHashMapの要素のビューであるという事実を利用しています。これにより、それらを調べて、削除されたキーをログアウトし、clear()を呼び出すだけで元のマップからそれらを削除できます。

プロジェクトでgoogle-collectionsライブラリを使用したくない理由があるかもしれませんが、使用しない場合は、チェックすることをお勧めします。

6
Jon Quarfoth

リストを繰り返し処理し、値オブジェクトを確認して、条件付きで削除を実行する必要があります。 HashMapを反復処理しているときにオブジェクトを削除しようとすると、例外が発生することに注意してください。マップのコピーを作成するか、ConcurrentHashMapを使用する必要があります。

2
Marcus Leon