Ich habe ein Map<String, ArrayList>
und ein Set<String>
. Gibt es eine Möglichkeit, die Schlüssel der Karte mit dem Satz von Zeichenfolgen zu “schneiden”, sodass nur die Paare mit dem angegebenen Schlüssel übrig bleiben, ohne über die gesamte Karte zu iterieren? Mein Hauptanliegen ist die Leistung und die Neuerfindung des Rades für etwas, das eleganter gemacht werden kann.
Filtern Sie die Elemente einer Karte basierend auf einer Teilmenge ihrer Schlüssel, ohne das Ganze zu durchlaufen
dave
BalusC
Mach einfach:
map.keySet().retainAll(set);
Gemäß der javadocwerden die Änderungen im Schlüsselsatz wieder in der Karte widergespiegelt.
… Der Satz wird von der Karte unterstützt, sodass Änderungen an der Karte im Satz widergespiegelt werden und umgekehrt. …
Hier ist eine Demo:
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}
-
Wow. Nie gewusst
KeySet
unterstütztretainAll
. So nützlich.– Paul Tucher
1. März 2013 um 5:30 Uhr
-
Sammlungen seit 1.1 verwenden – und dies auch nicht wussten.
– WestCoastProjects
28. Oktober 2013 um 2:48 Uhr
-
Unglaublich nützlich. values() unterstützt dies ebenfalls.
– Siddhartha
12. Februar 2016 um 8:10 Uhr
In Anlehnung an die hervorragende Antwort von BalusC unterstützt values() auch requireAll():
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 behält auch doppelte Werte bei, wie Sie es erwarten würden:
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}