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基本操作
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定义的对象,一种是自己定义的对象;
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接口了;
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 ; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架