Xóa nhiều khóa khỏi Bản đồ một cách hiệu quả?


124

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

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

Điều này đang hoạt động. Tôi chỉ muốn biết, cách tốt hơn để đạt được yêu cầu của tôi là gì?

Câu trả lời:


241

Giả thiết lập của bạn có chứa các chuỗi bạn muốn loại bỏ, bạn có thể sử dụng các keySetphương phápmap.keySet().removeAll(keySet);.

keySettrả về chế độ xem Tập hợp các khóa có trong bản đồ này. Tập hợp được hỗ trợ bởi bản đồ, vì vậy những thay đổi đối với bản đồ được phản ánh trong tập hợp và ngược lại.

Ví dụ có sẵn:

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"

gợi ý của bạn là tuyệt vời. Tôi đoán RemoveAll (keySet) đang làm những gì tôi đã có
Ruchira Gayan Ranaweera

11
về "hiệu quả" có lẽ nó chỉ là một vòng lặp for bên dưới, nhưng về mã sạch, thắng đẹp :)
rogerdpack

3

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

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

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

Sử dụng luồng Java:

keySet.forEach(map::remove);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.