Map排序高级用法
Peng's Blog 只记录和技术相关的东西

Map排序高级用法

2017-07-18

前言

前不久有写过一篇博客,关于Map按key排序、按value排序。详情见:http://blog.tanpeng.net/2017/07/02/mapSortByKey-Value/

人总是要有进步的嘛,进过一段时间的学习,发现之前的写法虽然不错,但是稍微有点简单而且有点长。我觉得可以用lambda表达式对其进行缩减。

而且今天项目中遇到一个比较复杂的Map数据结构,需要对其进行排序。经过一番摸索之后,最终得到了解决。

先对高级用法进行整理。

待排序的数据

Map<Integer, List<Host>>

目标:按照value里的 第一个对象load 属性进行排序。(Host是我们定义的一个对象,这个不是重点)

* 在抓取数据的时候,对数据进行了分组。(这部分内容与本文主题无关,可略过)

Map<Integer, List<Host» hostAfterGroup = hosts.stream().collect(Collectors.groupingBy(Host::getGroupid));

这也是Java8的一种写法,先转换成流,然后转换成集合,不过需要按照Host对象的groupid进行分组。这个用的也非常多。

排序器

升序

valueComparator = Comparator.comparingInt(o -> o.getValue().get(0).getLoad());

后面那东西叫lambda表达式,这样就省掉了重写compare方法了,代码短了很多。后面那部分的意思就是获取当前对象然后取得里面的第一个元素,再根据load属性的值进行排序。

降序

valueComparator = (o1,o2)-> o2.getValue().get(0).getLoad() - o1.getValue().get(0).getLoad();

降序稍微复杂一点点,多了个参数,不过也还好。代码一看就能懂。

利用Collections.sort进行排序

其实关于这个还有更高级的写法,但我觉得那样不太便于理解。这样也挺好的

List list = new ArrayList<>(hostAfterGroup.entrySet());
Collections.sort(list, valueComparator);

先将目标map转换成list对象

利用Collections.sort进行排序,传入两个参数,第一个参数是目标list,第二个参数就是我们之前写好的排序器了。

至此,排序已经完成。

排序结果

屏幕快照 2017-07-18 下午6.31.14

通过debug之后,我们能很明显的看到是按照第1个元素的load进行排序的。图中演示的是升序,降序换个比较器就OK了,这里不再赘述。


Comments

评论功能暂停使用,如需跟作者讨论请联系底部的GitHub