java8 实现map以value值排序操作
我就废话不多说了,大家还是直接看代码吧~
importjava.util.Collections; importjava.util.HashMap; importjava.util.Map; importjava.util.stream.Collector; importjava.util.stream.Collectors; importjava.util.LinkedHashMap; publicclassMapSorted{ publicstaticvoidmain(String[]args){ Mapmap=newHashMap<>(); map.put("A",3); map.put("B",5); map.put("C",1); map.put("D",1); map.put("E",9); System.out.println(map); //如果value为java对象,则需要实现Comparable接口,重写compareTo方法 Map sortedMap=newLinkedHashMap<>(); Map sortedMap2=newLinkedHashMap<>(); //ASC map.entrySet().stream() .sorted(Map.Entry. comparingByValue()) .forEachOrdered(x->sortedMap.put(x.getKey(),x.getValue())); System.out.println(sortedMap); //DESCCollections.reverseOrder||reversed() map.entrySet().stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) .forEachOrdered(x->sortedMap2.put(x.getKey(),x.getValue())); //map.entrySet().stream() //.sorted(Map.Entry. comparingByValue().reversed()) //.forEachOrdered(x->sortedMap2.put(x.getKey(),x.getValue())); System.out.println(sortedMap2); //Collectors.toMap直接返回排好序的map map=map.entrySet().stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) .collect(Collectors.toMap(x->x.getKey(),x->x.getValue(),(x1,x2)->x2,LinkedHashMap::new)); //map=map.entrySet().stream() //.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) //.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(x1,x2)->x2,LinkedHashMap::new)); System.out.println(map); } }
{A=3,B=5,C=1,D=1,E=9} {C=1,D=1,A=3,B=5,E=9} {E=9,B=5,A=3,C=1,D=1} {E=9,B=5,A=3,C=1,D=1}
补充知识:对Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序
今天我们来实战一把,对Map的Value值排序进行简化.
在以前的思路我们的做法如下:
/** * *Map根据value排序; * *@parammap *@return */ publicstatic>Map sortByValue(Map map){ List >list=newLinkedList<>(map.entrySet()); Collections.sort(list,newComparator >(){ @Override publicintcompare(Map.Entry o1,Map.Entry o2){ return(o2.getValue()).compareTo(o1.getValue()); } }); Map result=newLinkedHashMap<>(); for(Map.Entry entry:list){ result.put(entry.getKey(),entry.getValue()); } returnresult; }
什么意思呢?意思就是先把Map变成可排序的List使用Comparator接口对entry进行排序,可是这样代码很多很乱,我们需要做一些简化.
第一步:使用Lambda表达式先对Comparator接口做简化,代码会变成如下情况:
publicstatic>Map sortByValue(Map map){ List >list=newLinkedList<>(map.entrySet()); list.sort(Comparator.comparing(Entry::getValue)); Map result=newLinkedHashMap<>(); for(Map.Entry entry:list){ result.put(entry.getKey(),entry.getValue()); } returnresult; }
这样的话,一行代码就代替了五行,但是会有个问题,这样写只能从小到大排序很不灵活,我们还有其他办法.来看下面的代码:
publicstatic>Map sortByValue(Map map){ List >list=newLinkedList<>(map.entrySet()); list.sort((o1,o2)->o2.getValue().compareTo(o1.getValue())); Map result=newLinkedHashMap<>(); for(Map.Entry entry:list){ result.put(entry.getKey(),entry.getValue()); } returnresult; }
用lambda表达式就可以做到变换排序的方式,只要改变o1和o2的顺序就可以了.哎,可以还是很长,我还想再少几句代码,怎么办?
我们来分析下最原始的排序代码--->首先是将Map转化为List
publicstatic>Map sortByValue(Map map){ List >list=newLinkedList<>(map.entrySet()); list.sort((o1,o2)->o2.getValue().compareTo(o1.getValue())); Map result=newLinkedHashMap<>(); list.stream().forEach(entry->result.put(entry.getKey(),entry.getValue())); returnresult; }
也许做到上面这一步已经很满足了,可是作为一个优秀的开发人员怎么能满足于这种程度,我们要用两句话完成上面的功能.我们可以发现entrySet()是个集合,stream是有sort方法的,可以set变成stream然后sort之后forEach到新的Map中,牛逼吧,废话少说,看代码.
publicstatic>Map sortByValue(Map map){ Map sortMap=newLinkedHashMap<>(); newmap.entrySet().stream() .sorted((o1,o2)->o2.getValue().compareTo(o1.getValue())) .forEach(entry->sortMap.put(entry.getKey(),entry.getValue())); returnsortMap; }
高级程序员到这里就可以了,下面提供一个工具类给大家使用.
/** *flag=1正序 *flag=0倒序 *@parammap *@paramflag *@return */ publicstatic>Map sortByValue(Map map,intflag){ Map sortMap=newLinkedHashMap<>(); if(flag==1){ map.entrySet().stream() .sorted((o1,o2)->o1.getValue().compareTo(o2.getValue())) .forEach(entry->sortMap.put(entry.getKey(),entry.getValue())); }else{ map.entrySet().stream() .sorted((o1,o2)->o2.getValue().compareTo(o1.getValue())) .forEach(entry->sortMap.put(entry.getKey(),entry.getValue())); } returnsortMap; }
以上的代码已经够简洁了,但是有一个中间变量,我作为一个究极程序员是看不惯的,能不能把它也省略掉一句代码实现整个功能呢?答案是可以的.
publicstatic>Map sortByValue2(Map map,intflag){ if(flag==1){ returnmap.entrySet().stream().sorted((o1,o2)->o1.getValue().compareTo(o2.getValue())).map(entry->{ Map result=newLinkedHashMap<>(); result.put(entry.getKey(),entry.getValue()); returnresult; }).reduce((map1,map2)->{ map2.entrySet().forEach(entry->map1.put(entry.getKey(),entry.getValue())); returnmap1; }).get(); }else{ returnmap.entrySet().stream().sorted((o1,o2)->o2.getValue().compareTo(o1.getValue())).map(entry->{ Map result=newLinkedHashMap<>(); result.put(entry.getKey(),entry.getValue()); returnresult; }).reduce((map1,map2)->{ map2.entrySet().forEach(entry->map1.put(entry.getKey(),entry.getValue())); returnmap1; }).get(); }
思路是做好排序后将排序后的entry加入到新的Map里面,再将stream
以上这篇java8实现map以value值排序操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。