Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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
如何使用flatmap java8根据值的键数对哈希映射进行排序?_Java_Hash_Lambda_Java 8_Java Stream - Fatal编程技术网

如何使用flatmap java8根据值的键数对哈希映射进行排序?

如何使用flatmap java8根据值的键数对哈希映射进行排序?,java,hash,lambda,java-8,java-stream,Java,Hash,Lambda,Java 8,Java Stream,这是我们的后续行动。我有一个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, Arra

这是我们的后续行动。我有一个
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));
}};
这意味着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);
键和值应根据键的计数按降序排列
{0=2,1=3,2=3,3=3,4=3,5=2}
:1,2,3,4有三个键,0和5有两个键


例如:
1=[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
       ));
使用的静态导入:

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;

检查:,基本上使用树形图和comparator@LouisF. 是的,我查过了。如果我使用比较器,我可以得到以下输出,{1=3,2=3,3=3,4=3,0=2,5=2}。但是我想要的是1=[2,3,0],2=[1,4,0],3=[1,4,5],4=[2,3,5],0=[1,2],5=[3,4]。那么,在java8中是否有任何预定义的函数可以使用streams根据值的键数进行排序呢?我对java8非常陌生。所以我真的不知道怎么表演。有什么想法吗?在这里,您要对键和值列表进行排序。首先使用TreeMap和自定义比较器对键进行排序。然后尝试对每个值列表进行排序。即使可以,也不要尝试混合所有内容,这会损害可读性。
1=[2, 3, 0], 2=[1,4,0], 3=[1, 4, 5], 4=[2, 3, 5], 0=[1, 2], 5=[3, 4]
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
       ));
{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;