IT story

효율적인 방법으로 Map에서 여러 키를 제거 하시겠습니까?

hot-time 2020. 8. 3. 17:34
반응형

효율적인 방법으로 Map에서 여러 키를 제거 하시겠습니까?


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

작동합니다. 내 요구 사항을 달성하는 더 좋은 방법은 무엇입니까?


제거 할 문자열을 사용자의 설정을 포함 가정하면 사용할 수 있습니다 방법.keySetmap.keySet().removeAll(keySet);

keySet이 맵에 포함 된 키의 Set 뷰를 반환합니다. 세트는 맵에 의해 지원되므로 맵에 대한 변경 사항이 세트에 반영되며 그 반대도 마찬가지입니다.

고안된 예 :

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"

완전성을 위해서만 :

짐작할 수 있듯이 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());
    }
}

자바 스트림 사용하기 :

keySet.forEach(map::remove);

참고 URL : https://stackoverflow.com/questions/17675804/remove-multiple-keys-from-map-in-efficient-way

반응형