9

我正在使用 google guava 12 并有一张地图:

Map<OccupancyType, BigDecimal> roomPrice;

我有一套:

Set<OccupancyType> policy;

如何过滤roomPrice map基于policy并返回过滤后的地图中的条目?

filteredMap需要具有来自 的所有值policy。如果 roomPrice 地图没有政策条目,我想输入默认值。

4

3 回答 3

29

由于您有一组键,您应该使用Maps.filterkeys(),Guava 还提供了一组非常好的谓词,您可以开箱即用。在您的情况下,Predicates.in() 之类的东西应该可以工作。

所以基本上你最终得到:

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

希望能帮助到你。

于 2012-06-27T08:09:34.767 回答
2
  • 覆盖并实施equalshashcodeOccupancyType.
  • 循环遍历roomPrice的键集并收集过滤器中包含的元素。

像这样的东西:

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

应该做的伎俩。

于 2012-06-27T07:47:30.177 回答
0

无需使用 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));
    }
}
于 2021-03-29T11:11:21.763 回答