2010-04-07 37 views
16

Vì vậy, tôi có một java hashmap như dưới đây:Loại bỏ tất cả các mục của một giá trị nhất định từ một hashmap

hMap.put("1", "One"); 
hMap.put("2", "Two"); 
hMap.put("3", "Two"); 

Tôi muốn loại bỏ tất cả các mục trong đó giá trị là "Hai"

Nếu tôi làm một cái gì đó như:

hmap.values().remove("Two"); 

Chỉ có người đầu tiên bị xóa, tôi muốn xóa tất cả, làm thế nào điều này có thể được thực hiện?

Trả lời

41

hmap.values().removeAll(Collections.singleton("Two"));

EDIT: sự (đáng kể) bất lợi với cách tiếp cận ngắn gọn này là bạn về cơ bản buộc phải nhận xét nó, nói cái gì đó như

// remove("Two") would only remove the first one

khác, một số có ý tốt kỹ sư sẽ cố gắng đơn giản hóa nó cho bạn một ngày nào đó và phá vỡ nó. Điều này xảy ra ... đôi khi người làm tốt có thiện chí thậm chí là Tương lai Bạn!

+0

Điều này có vẻ tốt kevin, là có bất kỳ cách nào để viết một dòng gỡ lỗi ở trên để cho biết các phím là về để được whacked? –

+0

Bạn có thể muốn xem xét giải pháp của Ron (hoặc của tôi, nếu bạn sẵn sàng thêm bộ sưu tập google) nếu bạn cần đăng nhập các khóa đã xóa. –

+0

Yep, Ron và Jon (ha) câu trả lời là cả hai khả thi nếu bạn muốn biết các phím bạn đang whacking. Tôi có xu hướng thích Ron, chỉ lướt qua bản đồ một lần. –

13
for (Iterator<Map.Entry<String,String>> it = hMap.entrySet().iterator(); it.hasNext();) { 
Map.Entry<String,String> e = it.next(); 
if ("Two".equals(e.getValue())) { 
    it.remove(); 
} 
} 

+2

Giải pháp này chắc chắn là hợp lệ, nhưng câu trả lời của Kevin là nhiều hơn nữa súc tích. –

+0

Nó có thể được đưa vào một phương pháp riêng biệt, và sau đó nó không quan trọng nếu nó quá chi tiết. : P –

2

Bạn cần phải lặp qua danh sách, nhìn vào các đối tượng có giá trị, và có điều kiện thực hiện loại bỏ. Lưu ý bạn sẽ nhận được một ngoại lệ nếu bạn cố gắng loại bỏ một đối tượng trong khi lặp qua một HashMap. Phải sao chép bản đồ hoặc sử dụng ConcurrentHashMap.

10

Bạn có thể sử dụng while(hmap.values().remove("Two")); kể từ khi xóa cuộc gọi trả về true nếu bộ sưu tập đã bị thay đổi do cuộc gọi.

+0

hoạt động rất tốt, và tôi nghĩ là một phần tốt của lý do tại sao remove() trả về boolean. – oedo

+6

Điều này có hiệu suất bậc hai, mặc dù. –

+0

@ kevin, "hiệu suất bậc hai là gì?" xấu tốt/? –

6

(giải pháp cập nhật cho khai thác gỗ của các giá trị bị loại bỏ)

giải pháp này sử dụng google-bộ sưu tập thư viện [LINK]

import static com.google.common.collect.Maps.filterValues; 
import static com.google.common.base.Predicates.equalTo; 

... 

Map<String, String> removedValues = filterValues(hMap, equalTo("Two"));  
System.out.println(removedValues); //Log Removed Values 
removedValues.clear(); //Removes from original map, since this is a view. 

Lưu ý - Giải pháp này lợi dụng thực tế là bản đồ được trả về bởi các cuộc gọi filterValues ​​là một khung nhìn của các phần tử trong HashMap gốc. Điều này cho phép chúng tôi kiểm tra chúng và đăng xuất các khóa đã được gỡ bỏ, và sau đó loại bỏ chúng khỏi bản đồ ban đầu với một cuộc gọi đơn giản để xóa().

Bạn có thể có lý do không muốn sử dụng thư viện bộ sưu tập google trong dự án của mình, nhưng nếu bạn không làm như vậy, tôi khuyên bạn nên kiểm tra.

16

Trong Java 8

hmap.values().removeIf(val -> "Two".equals(val)); 
Các vấn đề liên quan