我有一个HashMap,我想找到每个值的键数
HashMap
Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>() {{ put(0, Arrays.asList(1, 2)); put(1, Arrays.asList(2, 0, 3)); put(2, Arrays.asList(4,0,1)); put(3, Arrays.asList(4,1, 5)); put(4, Arrays.asList(5,2,3)); put(5, Arrays.asList(4,3)); }};
根据上面的帖子,我尝试了平面映射:
Map<Object, Long> ex = map.values() .stream() .flatMap(Collection::stream) .collect(Collectors.groupingBy(v -> v, Collectors.counting())); System.out.println(ex);
输出是
{0=2, 1=3, 2=3, 3=3, 4=3, 5=2}.
这意味着0有两个键,1有三个键,依此类推。现在,我想根据键的数量以降序对键和值进行排序。我尝试过这样的事情:
Map<Object, Long> ex = map.values() .stream() .flatMap(Collection::stream) .collect(Collectors.groupingBy(v -> v, Collectors.counting())); .entrySet() .stream() .sorted(Map.Entry.<String, Long>comparingByValue(reverseOrder()).thenComparing(Map.Entry.comparingByKey())) .collect(LinkedHashMap::new, (m,e) -> m.put(e.getKey(), e.getValue()), Map::putAll);
我想要以下输出:
1=[2, 3, 0], 2=[1,4,0], 3=[1, 4, 5], 4=[2, 3, 5], 0=[1, 2], 5=[3, 4]
键和值应根据此键的数量降序排列{0=2, 1=3, 2=3, 3=3, 4=3, 5=2}:1、2、3、4具有三个键,0和5具有两个键。
{0=2, 1=3, 2=3, 3=3, 4=3, 5=2}
例如::1=[2, 3, 0]1具有三个键,因此它首先出现[2, 3, 0]:2和3具有三个键,而0仅具有两个键。
1=[2, 3, 0]
[2, 3, 0]
您可能具有以下内容:
Map<Integer, List<Integer>> sorted = map.entrySet() .stream() .sorted(comparing(e -> ex.get(e.getKey()), reverseOrder())) .collect(toMap( Map.Entry::getKey, e -> e.getValue().stream().sorted(comparing(ex::get, reverseOrder())).collect(toList()), (v1, v2) -> { throw new IllegalStateException(); }, LinkedHashMap::new ));
这将创建一个映射条目的流,根据该条目的键的键计数以相反的顺序对它们进行排序,最后将其收集到一个映射中,在该映射中,新值相对于每个整数的计数以相反的顺序进行排序(ex::get)。收集地图是LinkedHashMap为了保留遭遇顺序。
ex::get
LinkedHashMap
输出:
{1=[2, 3, 0], 2=[4, 1, 0], 3=[4, 1, 5], 4=[2, 3, 5], 0=[1, 2], 5=[4, 3]}
使用的静态导入:
import static java.util.Comparator.comparing; import static java.util.Comparator.reverseOrder; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap;