Ефективно видалити декілька ключів з Карти?


124

У мене є Map<String,String>велика кількість пар ключових значень. Тепер я хочу видалити вибрані ключі з цього Map. Наступний код показує, що я зробив для досягнення цього.

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

Тоді :

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

Це працює. Я просто хочу знати, що було б кращим способом досягти моєї потреби?

Відповіді:


241

Якщо припустити , що набір містить рядки , які ви хочете видалити, ви можете використовувати в keySetметод і map.keySet().removeAll(keySet);.

keySetповертає набір клавіш, що містяться на цій карті. Набір підтримується картою, тому зміни на карті відображаються в наборі, і навпаки.

Надуманий приклад:

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"

Ваша пропозиція чудова. Я думаю, що RemoveAll (keySet) робить те, що я там робив
Ruchira Gayan Ranaweera

11
з точки зору "ефективності" це, мабуть, просто цикл для циклу внизу, але з точки зору більш чистого коду, приємний виграш :)
rogerdpack

3

Просто задля повноти:

Як ви здогадувались, java.util.AbstractSet#removeAllсправді повторюється над усіма записами, але з однією невеликою хитрістю: він використовує ітератор меншої колекції:

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());
    }
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.