我正在使用 google guava 12 并有一张地图:
Map<OccupancyType, BigDecimal> roomPrice;
我有一套:
Set<OccupancyType> policy;
如何过滤roomPrice map
基于policy
并返回过滤后的地图中的条目?
filteredMap
需要具有来自 的所有值policy
。如果 roomPrice 地图没有政策条目,我想输入默认值。
由于您有一组键,您应该使用Maps.filterkeys(),Guava 还提供了一组非常好的谓词,您可以开箱即用。在您的情况下,Predicates.in() 之类的东西应该可以工作。
所以基本上你最终得到:
Map<OccupancyType, BigDecimal> filteredMap
= Maps.filterKeys(roomPrice, Predicates.in(policy));
希望能帮助到你。
像这样的东西:
Map<OccupancyType, BigDecimal> filteredPrices = new HashMap<OccupancyType, BigDecimal>();
for(OccupancyType key : roomPrice.keySet()) {
if(policy.contains(key) {
filteredPrices.put(key, roomPrice.get(key));
}
}
更新
好的,在 Google Guava 上阅读了一些内容之后,您应该能够执行以下操作:
Predicate<OccupancyType> priceFilter = new Predicate<OccupancyType>() {
public boolean apply(OccupancyType i) {
return policy.contains(i);
}
};
接着
return Maps.filterValues(roomPrice, priceFlter);
应该做的伎俩。
无需使用 Guava,Maps.filterKeys() 也可以为大型 Maps产生性能非常差的结果。
// (new map can be initialized to better value to avoid resizing)
Map<OccupancyType, BigDecimal> filteredMap = new HashMap<>(roomPrice.size());
for (OccupancyType key: policy) {
// contains() and get() can usually be combined
if (roomPrice.contains(key)) {
filteredMap.put(key, roomPrice.get(key));
}
}