我是java8的新手,我想写一个按值对hashmap进行排序的函数,如果值也是按键排序的话。
要按值对哈希图进行排序,请执行以下操作:
Map<String, Integer> map1 = new LinkedHashMap<>();
map.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.forEachOrdered(x -> map1.put(x.getKey(), x.getValue()));
map1.forEach((k,v) ->{ System.out.println(k +" "+v);} );
我使用过Python3,它使用mapSorted = sorted(map.items()
、key = lambda item : (item[1], item[0]))
对键和值进行排序。Java 8中也有类似的东西吗?
发布于 2020-12-28 07:56:10
您期待的接口是Comparator#thenComparing
。这种排序的实现并不直接的原因是因为类型推断。
类型推断需要一些帮助,这些帮助可以提供,例如:
Comparator.comparing(Map.Entry<String, Integer>::getValue)
.reversed().thenComparing(Map.Entry::getKey)
除此之外,理想情况下,您应该将输出收集到保留顺序的Map中,否则,排序将是计算的浪费。因此,这样的东西应该是有效的:
LinkedHashMap<String, Integer> sortedMap = map.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue)
.reversed().thenComparing(Map.Entry::getKey))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(a, b) -> a, LinkedHashMap::new));
发布于 2020-12-28 06:58:22
定义地图
HashMap<String, Integer>map1 = new HashMap();
map1.put("aa",5);
map1.put("bbb",2);
map1.put("ccccc",2);
map1.put("dddddd",3);
排序,如果你想与字符串进行比较,你需要自己定义它
List<Entry<String, Integer>> collect = map1.entrySet().stream().sorted(new Comparator<Entry<String, Integer>>(){
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
int ll=0;
if (o1.getValue()>o2.getValue()){
ll=-1;
}
else if(o1.getValue()<o2.getValue()){
ll=1;
}
else if (o1.getKey().length()>o2.getKey().length()) {
ll=-1;
}
else if (o1.getKey().length()<o2.getKey().length()) {
ll=1;
};
return ll;
}
}).collect(Collectors.toList());
结果类似于aa=5、dddddd=3、ccccc=2、bbb=2
https://stackoverflow.com/questions/65473659
复制相似问题