나는이 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());
}
이것은 효과가 있습니다. 내 요구 사항을 달성하는 더 좋은 방법이 무엇인지 알고 싶습니다.
답변
제거 할 문자열을 사용자의 설정을 포함 가정하면 사용할 수 있습니다 방법 및 .keySet
map.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());
}
}
답변
Java 스트림 사용 :
keySet.forEach(map::remove);