Czy skutecznie usunąć wiele kluczy z mapy?


124

Mam Map<String,String>dużą liczbę par klucz-wartość. Teraz chcę usunąć z tego wybrane klucze Map. Poniższy kod pokazuje, co zrobiłem, aby to osiągnąć.

Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 

Następnie :

Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
   map.remove( entriesIterator.next().toString());
} 

To działa. Chcę tylko wiedzieć, jaki byłby lepszy sposób na spełnienie moich wymagań?

Odpowiedzi:


241

Zakładając, że zestaw zawiera ciągi, które chcesz usunąć, można skorzystać z keySetmetody a map.keySet().removeAll(keySet);.

keySetzwraca widok zestawu kluczy zawartych w tej mapie. Zestaw jest obsługiwany przez mapę, więc zmiany w mapie są odzwierciedlane w zestawie i odwrotnie.

Wymyślony przykład:

Map<String, String> map = new HashMap<>();
map.put("a", "");
map.put("b", "");
map.put("c", "");

Set<String> set = new HashSet<> ();
set.add("a");
set.add("b");

map.keySet().removeAll(set);

System.out.println(map); //only contains "c"

twoja sugestia jest świetna. Chyba removeAll (keySet) robi to, co ja tam zrobiłem
Ruchira Gayan Ranaweera

11
pod względem "wydajności" to prawdopodobnie tylko pętla for pod spodem, ale jeśli chodzi o czystszy kod, niezłe zwycięstwo :)
rogerdpack

3

Tylko ze względu na kompletność:

Jak się domyślam, java.util.AbstractSet#removeAlldokonuje iteracji po wszystkich wpisach, ale z jedną małą sztuczką: używa iteratora mniejszej kolekcji:

if (size() <= collection.size()) {
    Iterator<?> it = iterator();
    while (it.hasNext()) {
        if (collection.contains(it.next())) {
            it.remove();
        }
    }
} else {
    Iterator<?> it = collection.iterator();
    while (it.hasNext()) {
        remove(it.next());
    }
}

1

Korzystanie ze strumienia Java:

keySet.forEach(map::remove);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.