Filtern Sie die Elemente einer Karte basierend auf einer Teilmenge ihrer Schlüssel, ohne das Ganze zu durchlaufen

Lesezeit: 2 Minuten

Benutzer-Avatar
dave

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.

Benutzer-Avatar
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ützt retainAll. 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}

1079100cookie-checkFiltern Sie die Elemente einer Karte basierend auf einer Teilmenge ihrer Schlüssel, ohne das Ganze zu durchlaufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy