2012-06-27 20 views
7

Tôi đang sử dụng google ổi 12 và có một bản đồ:làm thế nào tôi có thể lọc các mục bản đồ dựa trên tập hợp các mục

Map<OccupancyType, BigDecimal> roomPrice; 

Tôi có một Set:

Set<OccupancyType> policy; 

Làm thế nào tôi có thể lọc các mục trong số roomPrice map dựa trên policy và trả lại bản đồ đã lọc?

filteredMap cần phải có tất cả các giá trị từ policy. Trong trường hợp, bản đồ roomPrice không có mục nhập từ chính sách, thay vào đó, tôi muốn nhập giá trị mặc định.

Trả lời

27

Vì bạn có Tập hợp khóa, bạn nên sử dụng Maps.filterkeys(), còn Guava cung cấp tập hợp các biến vị ngữ khá tốt mà bạn có thể sử dụng ngoài hộp. Trong trường hợp của bạn, chẳng hạn như Predicates.in() sẽ hoạt động.

Vì vậy, về cơ bản bạn kết thúc với:

Map<OccupancyType, BigDecimal> filteredMap 
    = Maps.filterKeys(roomPrice, Predicates.in(policy)); 

Hy vọng nó giúp.

+0

Cảm ơn! Tôi vẫn còn rất mới để Predicates và không chắc chắn làm thế nào nó sẽ tạo ra một vị ngữ sẽ làm việc trên bản đồ của tôi. Ngoài ra, có cách nào để đảm bảo, lọcMap nên có tất cả các giá trị từ chính sách. Trong trường hợp, bản đồ roomPrice không có mục nhập từ chính sách, thay vào đó, tôi muốn nhập giá trị mặc định. – brainydexter

+0

Nếu bạn có một bản đồ có các mục "mặc định", bạn có thể làm một cái gì đó như: filtersMap.putAll (Maps.difference (filtersMap, defaultMap) .entriesOnlyOnRight()); –

+1

Ngoài ra, bạn có thể xem bài viết này: http://scaramoche.blogspot.de/2010/08/googles-guava-library-tutorial-part-4.html Nó có một số ví dụ tốt đẹp về sử dụng Predicate. –

2
  • Override và thực hiện equalshashcode trong OccupancyType.
  • Vòng lặp qua mã khóa roomPrice và thu thập các phần tử có trong bộ lọc.

Something như thế này:

Map<OccupancyType, BigDecimal> filteredPrices = new HashMap<OccupancyType, BigDecimal>(); 
for(OccupancyType key : roomPrice.keySet()) { 
    if(policy.contains(key) { 
     filteredPrices.put(key, roomPrice.get(key)); 
    } 
} 

Cập nhật

Ok sau khi đọc lên một chút trên Google ổi, bạn sẽ có thể làm điều gì đó như:

Predicate<OccupancyType> priceFilter = new Predicate<OccupancyType>() { 
    public boolean apply(OccupancyType i) { 
     return policy.contains(i); 
    } 
}; 

và sau đó

return Maps.filterValues(roomPrice, priceFlter); 

nên thực hiện thủ thuật.

+0

Cảm ơn! Tôi biết điều đó có hiệu quả, nhưng tôi cũng học cách sử dụng ổi. Tôi đã hy vọng sử dụng một số loại Maps.filterEntries (...) [link] (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/ collect/Maps.html # filterEntries (java.util.Map, com.google.common.base.Predicate)) [/ link] từ google-guava. Bạn sẽ có bất kỳ ý tưởng làm thế nào tôi có thể làm điều trên với điều đó? – brainydexter

+0

Ok Tôi đã cập nhật câu trả lời của mình sau khi đọc về điều đó một chút cho tôi biết nếu nó hoạt động! – Jeshurun

+0

Bạn có nghĩ rằng nó phải là 'Maps.filterEntries (roomPrice, priceFilter); ' – brainydexter

Các vấn đề liên quan