對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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章