Java TreeMap 升序|降序排列

时间:2021-12-18 19:24:52
import java.util.Comparator;
import java.util.TreeMap;
public class Main {
	public static void main(String[] args) {
		TreeMap<Integer,Integer> map1 = new TreeMap<Integer,Integer>();  //默认的TreeMap升序排列
		TreeMap<Integer,Integer> map2= new TreeMap<Integer,Integer>(new Comparator<Integer>(){
			 /* 
	         * int compare(Object o1, Object o2) 返回一个基本类型的整型, 
	         * 返回负数表示:o1 小于o2, 
	         * 返回0 表示:o1和o2相等, 
	         * 返回正数表示:o1大于o2。 
	         */  
			public int compare(Integer a,Integer b){
				return b-a;			
			}
			});
		map2.put(1,2);
		map2.put(2,4);
		map2.put(7, 1);
		map2.put(5,2);
		System.out.println("Map2="+map2);  
		
		map1.put(1,2);
		map1.put(2,4);
		map1.put(7, 1);
		map1.put(5,2);
		System.out.println("map1="+map1);
	}
	
	
	
	
}


分析:可以通过自定义compare函数,来实现各种类型的排序。

以下内容取至Api:

TreeMap

public TreeMap()
使用键的自然顺序构造一个新的、空的树映射。插入该映射的所有键都必须实现 Comparable 接口。另外,所有这些键都必须是 可互相比较的:对于映射中的任意两个键 k1k2,执行 k1.compareTo(k2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的键添加到映射中(例如,用户试图将字符串键添加到键为整数的映射中),则 put(Object key, Object value) 调用将抛出 ClassCastException。 

TreeMap

public TreeMap(Comparator<? super K> comparator)
构造一个新的、空的树映射,该映射根据给定比较器进行排序。插入该映射的所有键都必须由给定比较器进行 相互比较:对于映射中的任意两个键 k1k2,执行 comparator.compare(k1, k2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的键放入映射中,则 put(Object key, Object value) 调用将抛出 ClassCastException

参数:
comparator - 将用来对此映射进行排序的比较器。如果该参数为 null,则将使用键的 自然顺序

java.util
接口 Comparator<T>

类型参数:
T - 此 Comparator 可以比较的对象类型
所有已知实现类:
Collator, RuleBasedCollator

compare

int compare(T o1,
            T o2)
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

在前面的描述中,符号 sgn(expression) 表示 signum 数学函数,根据 expression 的值为负数、0 还是正数,该函数分别返回 -101

实现程序必须确保对于所有的 xy 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)

实现程序还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0

最后,实现程序必须确保 compare(x, y)==0 意味着对于所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))

虽然这种情况很普遍,但并 严格要求 (compare(x, y)==0) == (x.equals(y))。一般说来,任何违背这个条件的 Comparator 都应该清楚地指出这一事实。推荐的语言是“注意:此 Comparator 强行进行与 equals 不一致的排序。”

参数:
o1 - 要比较的第一个对象。
o2 - 要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
抛出:
ClassCastException - 如果参数的类型不允许此 Comparator 对它们进行比较。