treeMap 排序

按key排序

package com.yeepay.g3.core.trade.bankinterface.service;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class SortMapByKey {

	public static void main(String[] args) {

		Map<String,String> sortMap = new TreeMap<String,String>(new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
		
	});
		
		sortMap.put("c", "1");
		sortMap.put("a", "3");
		sortMap.put("b", "4");
		sortMap.put("d", "5");
		
		Set<String> keySet = sortMap.keySet();
		Iterator<String> iterator = keySet.iterator();
		while(iterator.hasNext()) {
			String key =iterator.next();
			System.out.println(key + ":" + sortMap.get(key));
		}
	
	}

}
上面例子是对根据TreeMap的key值来进行排序的,但是有时我们需要根据TreeMap的value来进行排序。对value排序我们就需要借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较。如下:
按value排序

package com.yeepay.g3.core.trade.bankinterface.service;

import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.*;

public class SortMapByValue {

	public static void main(String[] args) {

		Map<String, String> map = new TreeMap<String, String>();
        map.put("d", "5");
        map.put("b", "2");
        map.put("a", "9");
        map.put("c", "6");
        
        //将map.entrySet转为list
        List<Map.Entry<String, String>>  list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, String>>(){

			@Override
			public int compare(Entry<String, String> o1, Entry<String, String> o2) {
				return o1.getValue().compareTo(o2.getValue());
			}
        	
        });
        
        for(Map.Entry<String, String> entry:list) {
        	  System.out.println(entry.getKey() + "******" + entry.getValue());
        }
	}

}


### Java TreeMap排序机制 TreeMap 是一种实现了 `SortedMap` 接口的类,在 Java 中用于提供按键自动排序的功能。该特性通过采用红黑树这种自平衡二叉查找树的数据结构得以实现[^2]。 #### 红黑树基础 红黑树是一种特殊的二叉搜索树,具有以下属性: - 节点要么是红色,要么是黑色。 - 根节点始终为黑色。 - 所有叶子结点都是黑色(实际上这些位置为空指针)。 - 如果一个节点是红色,则它的两个子节点均为黑色。(即不存在连续两条红线) - 对于任意节点而言,从该节点到其可达叶子节点的所有路径上均含有相同数量的黑色节点。 上述性质确保了即使经过多次插入删除操作之后,整棵树仍然保持大致平衡状态,从而保证了高效的查询效率 O(log n)。 #### 键比较方式 当向 TreeMap 添加新元素时,默认情况下会按照键对象自身的自然顺序来进行排列;如果希望改变默认行为也可以传入自定义 Comparator 来指定特定规则。对于可比较类型的键来说,比如 Integer 或 String 类型,它们已经实现了 Comparable 接口并重写了 compareTo 方法,因此可以直接使用而无需额外设置 comparator 参数[^3]。 ```java // 使用自然排序 TreeMap<Integer, String> map1 = new TreeMap<>(); map1.put(3, "three"); map1.put(1, "one"); map1.put(2, "two"); System.out.println(map1); // 输出 {1=one, 2=two, 3=three} // 自定义Comparator进行逆序排序 TreeMap<Integer, String> map2 = new TreeMap<>(Collections.reverseOrder()); map2.put(3, "three"); map2.put(1, "one"); map2.put(2, "two"); System.out.println(map2); // 输出 {3=three, 2=two, 1=one} ``` #### 插入过程中的调整 每当往 TreeMap 中加入新的 key-value pair 后,程序不仅需要考虑当前新增加进去的那个节点应该放置在哪里,还要维护整个红黑树应有的结构性质不变——这涉及到一系列复杂的旋转与重新着色动作以恢复被破坏掉的颜色交替模式和高度差不超过一倍的关系约束条件。 综上所述,Java 中 TreeMap 主要依靠红黑树这一底层数据结构来完成对输入项按需定制化后的升/降序整理工作,并且能够很好地兼顾时间复杂度上的表现力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值