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
接口。另外,所有这些键都必须是 可互相比较的:对于映射中的任意两个键 k1 和 k2,执行 k1.compareTo(k2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的键添加到映射中(例如,用户试图将字符串键添加到键为整数的映射中),则 put(Object key, Object value) 调用将抛出 ClassCastException。
TreeMap
public TreeMap(Comparator<? super K> comparator)
-
构造一个新的、空的树映射,该映射根据给定比较器进行排序。插入该映射的所有键都必须由给定比较器进行
相互比较:对于映射中的任意两个键
k1 和
k2,执行
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 还是正数,该函数分别返回 -1、0 或 1。
实现程序必须确保对于所有的 x 和 y 而言,都存在 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 对它们进行比较。