TreeMap简介


在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基本操作

[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
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= "&quot" ><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 ;
         }
     }
}
 
更多java学习资料可关注:itheimaGZ获取


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM