TreeMap底层根据红黑树的数据结构构建,默认根据key的自然排序来组织(比如integer的大小,String的字典排序)。所以,TreeMap只能根据key来排序,是不能根据value来排序的(否则key来排序根本就不能形成TreeMap)。
要根据value值对TreeMap进行排序,大致的思路是把TreeMap的EntrySet转换成list,然后使用Collections.sor排序
一、Map的 Entry 对象
1、Entry: 键值对 对象。
在Map类设计是,提供了一个嵌套接口(static修饰的接口):Entry。Entry将键值对的对应关系封装成了对象,即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
2、Entry为什么是静态的?
Entry是Map接口中提供的一个静态内部嵌套接口,修饰为静态可以通过类名调用。
Map集合遍历键值对的方式:
Set<Map.Entry<K,V>> entrySet();
//返回此映射中包含的映射关系的Set视图
该方法返回值是Set集合,里面装的是Entry接口类型,即将映射关系装入Set集合。
3、实现步骤:
1,调用Map集合中的entrySet()方法,将集合中的映射关系对象存储到Set集合中
2,迭代Set集合
3,获取Set集合的元素,是映射关系的对象
4,通过映射关系对象的方法,getKey()和getValue(),获取键值对
(原文链接: https://blog.youkuaiyun.com/weixin_39590058/article/details/79933984)
二、具体实现
先创建一个list用来存放排序后的值
List<Map.Entry<Integer, Map>> list =
new ArrayList<Map.Entry<Integer, Map>>(zeroTreeMap.entrySet());
因为 Collections.sort 是对list 进行操作,重写Comparator比较器
Collections.sort(list, new Comparator<Map.Entry<Integer, Map>>() {
@Override
public int compare(Entry<Integer, Map> o1, Entry<Integer, Map> o2) {
return o1.getValue().compareTo(o2.getValue());
}
}
- 返回负数表示:o1 小于o2,
- 返回0 表示:o1和o2相等,
- 返回正数表示:o1大于o2。
所以
- 升序排列: o2 - o1
- 降序排列: o1 - o2
(原文链接:https://blog.youkuaiyun.com/weixin_45483749/article/details/107866478)