2013-07-16 28 views
80

Tôi có một số Map<String,String> với số lượng lớn các cặp giá trị khóa. Bây giờ tôi muốn xóa các khóa đã chọn khỏi số Map. Đoạn mã sau cho thấy những gì tôi đã làm để đạt được điều đó.Xóa nhiều khóa khỏi Bản đồ theo cách hiệu quả?

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

Sau đó:

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

này đang làm việc. Tôi chỉ muốn biết, cách nào tốt hơn để đạt được yêu cầu của tôi?

Trả lời

161

Giả sử bộ của bạn chứa các chuỗi bạn muốn xóa, bạn có thể sử dụng the keySet methodmap.keySet().removeAll(keySet);.

keySet trả về chế độ xem Tập hợp các phím có trong bản đồ này. Bộ này được bản đồ sao lưu, vì vậy các thay đổi đối với bản đồ được phản ánh trong bộ này và ngược lại.

contrived dụ:

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" 
+0

đề xuất của bạn thật tuyệt vời. Tôi đoán removeAll (keySet) đang làm những gì tôi đã làm ở đó –

+8

về mặt "hiệu quả" của nó có lẽ chỉ là một vòng lặp bên dưới, nhưng về mã sạch hơn, giành chiến thắng tốt đẹp :) – rogerdpack

+0

thaks, tôi sử dụng retainAll – shareef

1

Chỉ vì lợi ích của sự hoàn chỉnh:

Như đoán java.util.AbstractSet#removeAll thực sự lặp trên tất cả các mục, nhưng với một mẹo nhỏ: Nó sử dụng iterator của bộ sưu tập nhỏ :

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()); 
    } 
} 
Các vấn đề liên quan