我有一个LinkedHashMap
.
sorted:{0=[1, 2], 5=[4, 3], 1=[2, 0, 3], 2=[4, 0, 1], 3=[4, 5, 1], 4=[5, 2, 3]}
我尝试根据每个键的大小过滤每个键的值.例如,对于条目2=[4, 0, 1]
,我需要过滤值,使得键只应具有大小大于或等于(>=
)的值
考虑一下2=[4, 1]
:因为0
只有两个元素,我们将其删除.4和1有三个元素,大小等于2,所以我们保留它.
最终输出应该是:
nodes_withHighDegreee :{0=[1, 2], 5=[4, 3], 1=[2, 3], 2=[4, 1], 3=[4, 1], 4=[2, 3]}
我试过了 :
Map> nodes_withHighDegree = sorted.entrySet().stream() .peek(e -> e.getValue().filter((a,b)-> map.get(a).size() >= map.get(b).size())) .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), (m0, m1) -> m0.putAll(m1)); System.out.println("After sort" + nodes_withHighDegree);
如何在这里使用过滤功能?
你可以很简单地使用它Map.replaceAll
.假设数据在LinkedHashMap
被调用的内部sorted
:
Map> filtered = new LinkedHashMap<>(sorted); filtered.replaceAll((k, v) -> v.stream() .filter(i -> sorted.get(i).size() >= v.size()) .collect(Collectors.toList()));
输出:
{0=[1, 2], 5=[4, 3], 1=[2, 3], 2=[4, 1], 3=[4, 1], 4=[2, 3]}
此代码创建映射的副本以保存已过滤的实例.然后它通过过滤它来替换每个值,并且只保留计数具有比当前计数更大值的整数.
在您当前的方法中,您正在使用peek
修改值,这是一种不好的做法.引用其API说明:
此方法主要用于支持调试,您希望在元素流经管道中的某个点时查看这些元素.