我有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<Integer, List<Integer>> 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);
如何在这里使用过滤功能?
答案 0 :(得分:6)
你可以很简单地使用Map.replaceAll
。假设数据位于名为LinkedHashMap
的{{1}}内:
sorted
输出:
Map<Integer, List<Integer>> 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]}
来修改值,这是一种不好的做法。引用其API note:
此方法主要用于支持调试,您希望在元素流经管道中的某个点时查看这些元素。