web-dev-qa-db-ja.com

全体を反復することなく、キーのサブセットに基づいてマップの要素をフィルタリングします

私はMap<String, ArrayList>およびSet<String>。マップ全体を反復することなく、指定されたキーを持つペアのみが残るように、マップのキーを一連の文字列と「交差」させる方法はありますか?私の主な関心事はパフォーマンスであり、よりエレガントにできる何かに車輪を再発明することです。

51
dave

ただやる:

map.keySet().retainAll(set);

javadoc に従って、キーセットの変更はマップに反映されます。

...セットはマップに連動しているため、マップへの変更はセットに反映され、その逆も同様です。 ...

デモは次のとおりです。

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

Set<String> set = new HashSet<String>();
set.add("1");
set.add("3");

map.keySet().retainAll(set);

System.out.println(map); // {3=three, 1=one}
114
BalusC

BalusCの優れた答えを詳しく説明すると、values()はretainAll()もサポートします。

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);   // prints {1=one, 2=two}

retailAllは、予想どおり、重複した値も保持します。

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
map.put("4", "two");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);  // prints {1=one, 2=two, 4=two}
9
Siddhartha