Java 如何根据条目集筛选地图条目
我正在使用google guava 12并有一张地图:Java 如何根据条目集筛选地图条目,java,map,set,guava,predicate,Java,Map,Set,Guava,Predicate,我正在使用google guava 12并有一张地图: Map<OccupancyType, BigDecimal> roomPrice; Map-roomPrice; 我有一套: Set<OccupancyType> policy; 设置策略; 如何根据策略过滤roomPrice映射中的条目并返回过滤后的映射 filteredMap需要包含策略中的所有值。如果roomPrice map没有来自策略的条目,我想输入默认值。 覆盖并执行和输入 职业类型 循环浏览ro
Map<OccupancyType, BigDecimal> roomPrice;
Map-roomPrice;
我有一套:
Set<OccupancyType> policy;
设置策略;
如何根据策略
过滤roomPrice映射中的条目并返回过滤后的映射
filteredMap
需要包含策略中的所有值。如果roomPrice map没有来自策略的条目,我想输入默认值。
- 覆盖并执行和输入
职业类型
李>
- 循环浏览
roomPrice
的键集并收集
过滤器中包含的元件
大概是这样的:
Map<OccupancyType, BigDecimal> filteredPrices = new HashMap<OccupancyType, BigDecimal>();
for(OccupancyType key : roomPrice.keySet()) {
if(policy.contains(key) {
filteredPrices.put(key, roomPrice.get(key));
}
}
应该做到这一点。既然你有一套应该使用的键,那么Guava也提供了一套非常好的谓词,你可以在开箱即用。在你的情况下,类似的方法应该有效
因此,基本上你会得到:
Map<OccupancyType, BigDecimal> filteredMap
= Maps.filterKeys(roomPrice, Predicates.in(policy));
Map filteredMap
=Maps.filterKeys(roomPrice,谓词.in(策略));
希望能有所帮助。无需使用番石榴,也可以使用Maps.filterKeys()对大型地图生成性能非常差的结果
// (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));
}
}
//(可以将新映射初始化为更好的值以避免调整大小)
Map filteredMap=newhashmap(roomPrice.size());
for(职业类型键:策略){
//contains()和get()通常可以组合使用
if(roomPrice.contains(键)){
filteredMap.put(key,roomPrice.get(key));
}
}
谢谢!我知道这很管用,但我也在学习使用番石榴。我希望使用google guava中的Maps.filterEntries(…)[link](,com.google.common.base.Predicate))[/link]之类的东西。你会不会有什么想法,我可以用它来做上面的事情?好的,我已经更新了我的答案,在读了一点之后,让我知道它是否有效!你不认为应该是Maps.filterEntries(roomPrice,priceFilter)代码>谢谢!我对谓词还是很陌生,不确定它将如何生成一个在我的映射上工作的谓词。另外,是否有任何方法可以确保filteredMap应该具有策略中的所有值。如果roomPrice映射没有来自策略的条目,我想改为输入默认值。如果您有一个包含“默认”条目的映射,则可以执行以下操作:filteredMap.putAll(Maps.difference(filteredMap,defaultMap.EntriesonLonRight());另外,您还可以看看这篇文章:它有一些很好的谓词用法示例。Maps.filterKeys()通常是一个不好的解决方案,因为它为contains()或size()等方法生成了一个复杂度为O(n)的原始映射的liveView。更好地使用来自的答案这是否回答了您的问题?
Map<OccupancyType, BigDecimal> filteredMap
= Maps.filterKeys(roomPrice, Predicates.in(policy));
// (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));
}
}