如何使用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;