对listMap中List的value的size()进行排序怎么写?

对这个List<Map<String,List<Integer>>> 的map的 value 的size进行排序?看着好像很复杂

1、先来了解个东西java.util.Collections 这个是java工具包下的集合操作工具类。工具类提供了各种各样的操作集合的方法,排序这种常规操作当然也不例外啦。Collections.sort(List<T>,Comparator);集合加比较器。

2、再来了解个东西keySet ,在map中 keSet 是返回一个map的所有key集合,iterator.next是拿到每个key。这里只需要取第一个,意味着可以直接写成 key=m1.keySet().iterator().next()  ,m1.get(key) 取到的就是map中的list。

Collections.sort(list, new Comparator<Map<Character, List<Integer>>>() {
            public int compare(Map<Character, List<Integer>> m1, Map<Character, List<Integer>> m2) {
                return m1.get(m1.keySet().iterator().next()).size()-m2.get(m2.keySet().iterator().next()).size();
            }
        });

3、继续了解个东西 entrySet ,在map中entrySet 返回的是个 key->value 的映射组合,与keyset不同的是entryset可以直接取到value。那么以上语句还可以写成

Collections.sort(list, new Comparator<Map<Character, List<Integer>>>() {
            public int compare(Map<Character, List<Integer>> m1, Map<Character, List<Integer>> m2) {
                return m1.entrySet().iterator().next().getValue().size()-m2.entrySet().iterator().next().getValue().size();
            }
        });

以下语法糖会带来性能上的损耗,以上代码执行5ms,以下代码执行平均60毫秒 效率差距12倍以上。

4、继续了解个东西,lambda表达式,匿名内部类在java8 中可以使用lambda表达式代替

那么以上语句可以写成

Collections.sort(list, (m1, m2) -> m1.entrySet().iterator().next().getValue().size()-m2.entrySet().iterator().next().getValue().size());

5、还能够继续简写,终极变身状态

Collections.sort(list, Comparator.comparingInt(m -> m.entrySet().iterator().next().getValue().size()));

所以最优写法为

Collections.sort(list, new Comparator<Map<Character, List<Integer>>>() {
            public int compare(Map<Character, List<Integer>> m1, Map<Character, List<Integer>> m2) {
                return m1.entrySet().iterator().next().getValue().size()-m2.entrySet().iterator().next().getValue().size();
            }
        });

entrySet 效率最好,语法也比较简洁。

 

发布了119 篇原创文章 · 获赞 28 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章