だから私は以下のようなJavaハッシュマップを持っています:
hMap.put("1", "One");
hMap.put("2", "Two");
hMap.put("3", "Two");
値が「2」のアイテムをすべて削除したい
私が次のようなことをした場合:
hmap.values().remove("Two");
最初のものだけが削除されます。すべて削除したいのですが、どうすればよいですか?
hmap.values().removeAll(Collections.singleton("Two"));
EDIT:この簡潔なアプローチの(重要な)欠点は、基本的にコメントを強制されることです。
// remove("Two") would only remove the first one
そうでなければ、善意のあるエンジニアがいつかあなたのためにそれを単純化して壊そうとします。これは起こります...時々善意の善良な人は未来のあなたでさえあります!
In Java 8
hmap.values().removeIf(val -> "Two".equals(val));
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();
}
}
呼び出しの結果としてコレクションが変更された場合、remove呼び出しはtrue
を返すため、while( hmap.values().remove("Two") );
を使用できます。
(削除された値をログに記録するための更新されたソリューション)
このソリューションは、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ライブラリを使用したくない理由があるかもしれませんが、使用しない場合は、チェックすることをお勧めします。
リストを繰り返し処理し、値オブジェクトを確認して、条件付きで削除を実行する必要があります。 HashMap
を反復処理しているときにオブジェクトを削除しようとすると、例外が発生することに注意してください。マップのコピーを作成するか、ConcurrentHashMap
を使用する必要があります。