在Map集合框架中,除了HashMap以外,TreeMap也是常用到的集合对象之一。
与HashMap相比,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。其中,可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序;
不同于HashMap的哈希映射,TreeMap实现了红黑树的结构,形成了一颗二叉树。
TreeMap继承于AbstractMap,实现了Map, Cloneable, NavigableMap, Serializable接口。
(1)TreeMap 继承于AbstractMap,而AbstractMap实现了Map接口,并实现了Map接口中定义的方法,减少了其子类继承的复杂度;
(2)TreeMap 实现了Map接口,成为Map框架中的一员,可以包含着key-value形式的元素;
(3)TreeMap 实现了NavigableMap接口,意味着拥有了更强的元素搜索能力;
(4)TreeMap 实现了Cloneable接口,实现了clone()方法,可以被克隆;
(5)TreeMap 实现了Java.io.Serializable接口,支持序列化操作;
TreeMap具有如下特点:
不允许出现重复的key;
可以插入null键,null值;
可以对元素进行排序;
无序集合(插入和遍历顺序不一致);
TreeMap基本操作
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
public class TreeMapTest {
public static void main(String[] agrs){
//创建TreeMap对象:
TreeMap<String,Integer> treeMap = new TreeMap<String,Integer>();
System.out.println( "初始化后,TreeMap元素个数为:" + treeMap.size());
//新增元素:
treeMap.put( "hello" , 1 );
treeMap.put( "world" , 2 );
treeMap.put( "my" , 3 );
treeMap.put( "name" , 4 );
treeMap.put( "is" , 5 );
treeMap.put( "huangqiuping" , 6 );
treeMap.put( "i" , 6 );
treeMap.put( "am" , 6 );
treeMap.put( "a" , 6 );
treeMap.put( "developer" , 6 );
System.out.println( "添加元素后,TreeMap元素个数为:" + treeMap.size());
//遍历元素:
Set<Map.Entry<String,Integer>> entrySet = treeMap.entrySet();
for (Map.Entry<String,Integer> entry : entrySet){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println( "TreeMap元素的key:" +key+ ",value:" +value);
}
//获取所有的key:
Set<String> keySet = treeMap.keySet();
for (String strKey:keySet){
System.out.println( "TreeMap集合中的key:" +strKey);
}
//获取所有的value:
Collection<Integer> valueList = treeMap.values();
for (Integer intValue:valueList){
System.out.println( "TreeMap集合中的value:" + intValue);
}
//获取元素:
//获取集合内元素key为"huangqiuping"的值
Integer getValue = treeMap.get( "huangqiuping" );
//获取集合内第一个元素
String firstKey = treeMap.firstKey();
//获取集合内最后一个元素
String lastKey =treeMap.lastKey();
//获取集合内的key小于"huangqiuping"的key
String lowerKey =treeMap.lowerKey( "huangqiuping" );
//获取集合内的key大于等于"huangqiuping"的key
String ceilingKey =treeMap.ceilingKey( "huangqiuping" );
//获取集合的key从"a"到"huangqiuping"的元素
SortedMap<String,Integer> sortedMap =treeMap.subMap( "a" , "my" );
//删除元素:
//删除集合中key为"huangqiuping"的元素
Integer removeValue = treeMap.remove( "huangqiuping" );
//清空集合元素:
treeMap.clear();
//判断方法:
//判断集合是否为空
boolean isEmpty = treeMap.isEmpty();
//判断集合的key中是否包含"huangqiuping"
boolean isContain = treeMap.containsKey( "huangqiuping" );
}
}
|
TreeMap排序
(1)使用元素自然排序
在使用自然顺序排序时候,需要区分两种情况:一种是Jdk定义的对象,一种是自己定义的对象;
[Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<font style= "color:rgb(77, 77, 77)" ><font face= """ ><font style= "font-size:16px" > public class SortedTest implements Comparable<SortedTest> {
private int age;
public SortedTest( int age){
this .age = age;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this .age = age;
}
//自定义对象,实现compareTo(T o)方法:
public int compareTo(SortedTest sortedTest) {
int num = this .age - sortedTest.getAge();
//为0时候,两者相同:
if (num== 0 ){
return 0 ;
//大于0时,传入的参数小:
} else if (num> 0 ){
return 1 ;
//小于0时,传入的参数大:
} else {
return - 1 ;
}
}
}
public class TreeMapTest {
public static void main(String[] agrs){
//自然顺序比较
naturalSort();
}
//自然排序顺序:
public static void naturalSort(){
//第一种情况:Integer对象
TreeMap<Integer,String> treeMapFirst = new TreeMap<Integer, String>();
treeMapFirst.put( 1 , "huangqiuping" );
treeMapFirst.put( 6 , "huangqiuping" );
treeMapFirst.put( 3 , "huangqiuping" );
treeMapFirst.put( 10 , "huangqiuping" );
treeMapFirst.put( 7 , "huangqiuping" );
treeMapFirst.put( 13 , "huangqiuping" );
System.out.println(treeMapFirst.toString());
//第二种情况:SortedTest对象
TreeMap<SortedTest,String> treeMapSecond = new TreeMap<SortedTest, String>();
treeMapSecond.put( new SortedTest( 10 ), "huangqiuping" );
treeMapSecond.put( new SortedTest( 1 ), "huangqiuping" );
treeMapSecond.put( new SortedTest( 13 ), "huangqiuping" );
treeMapSecond.put( new SortedTest( 4 ), "huangqiuping" );
treeMapSecond.put( new SortedTest( 0 ), "huangqiuping" );
treeMapSecond.put( new SortedTest( 9 ), "huangqiuping" );
System.out.println(treeMapSecond.toString());
}
}</font></font></font>
|
在自然顺序比较中,需要让被比较的元素实现Comparable接口,否则在向集合里添加元素时报:"java.lang.ClassCastException: com.huangqiuping.collection.map.SortedTest cannot be cast to java.lang.Comparable"异常;
这是因为在调用put()方法时,会将传入的元素转化成Comparable类型对象,所以当你传入的元素没有实现Comparable接口时,就无法转换,遍会报错;
(2)使用自定义比较器排序
使用自定义比较器排序,需要在创建TreeMap对象时,将自定义比较器对象传入到TreeMap构造方法中;
自定义比较器对象,需要实现Comparator接口,并实现比较方法compare(To1,To2);
使用自定义比较器排序的话,被比较的对象无需再实现Comparable接口了;
[Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public class SortedTest {
private int age;
public SortedTest( int age){
this .age = age;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this .age = age;
}
}
public class SortedTestComparator implements Comparator<SortedTest> {
//自定义比较器:实现compare(To1,To2)方法:
public int compare(SortedTest sortedTest1, SortedTest sortedTest2) {
int num = sortedTest1.getAge() - sortedTest2.getAge();
if (num== 0 ){ //为0时候,两者相同:
return 0 ;
} else if (num> 0 ){ //大于0时,后面的参数小:
return 1 ;
} else { //小于0时,前面的参数小:
return - 1 ;
}
}
}
|