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


124

나는이 Map<String,String>키 값 쌍 많은 수의. 이제 해당 .NET에서 선택한 키를 제거하고 싶습니다 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

제거 할 문자열을 사용자의 설정을 포함 가정하면 사용할 수 있습니다 방법 및 .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"

당신의 제안은 훌륭합니다. 나는에서 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());
    }
}

1

Java 스트림 사용 :

keySet.forEach(map::remove);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.