Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据条目集筛选地图条目_Java_Map_Set_Guava_Predicate - Fatal编程技术网

Java 如何根据条目集筛选地图条目

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

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

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