对这个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 效率最好,语法也比较简洁。