對這個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 效率最好,語法也比較簡潔。