【java集合】TreeMap集合
1、特点
1)TreeMap特点和hashmap类似,使用也类似。key不能重复
2)TreeMap底层用红黑树维护大小结构
3)使用时一定要提供比较器,否则会抛出异常
2、使用场景
1)如果需要维护key—value结构的大小顺序可以选择TreeMap
2)根据key排序
3、时间复杂度
时间复杂度:O(log2 n)
4、代码
主要写了如何使用外比较器和内比较器
1)内比较器:类本身提供,当本身提供的比较器不能满足需求时,可以重写内比较器(例如:自己写的类)
Comparable
2)外比较器:如果使用一个类提供的内比较器不满足需求时,而且我们不能修改这个类(例如:String)
Comparator是比较接口,如果我们需要控制某个类的次序,而该类本身不支持排序,那么我们就可以建立一个“该类的比较器"
public class MyTreeMap {
//comparable是一个排序接口,意味着该类支持排序
static class Student implements Comparable<Student >{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {//内比较器,规定对象大小比较规则
//如果返回负数 当前this对象的值小于 对象o
return this .age - o.age ;
}
}
//外比较器
//使用场景:如果要给一个对象提供多个比较原则时可以用外比较器,如果使用类的内部比较不符合我们的需求,但是这个类我们没办法修改
// Comparator是比较接口,如果我们需要控制某个类的次序,而该类本身不支持排序,那么我们就可以建立一个“该类的比较器"
static class IntergerCom implements Comparator <Integer >{
@Override
public int compare(Integer o1, Integer o2) {
return -(o1-o2);
}
}
static class StudentCpm implements Comparator <Student >{
@Override
public int compare(Student o1, Student o2) {
return o1 .age -o2.age ;
}
}
public static void main(String[] args) {
TreeMap <String ,Integer >map =new TreeMap<>() ;
map .put("sam",11);
map .put("alice",56);
map .put("jack",12);
map .put("ham",14);
map .remove("ham");
System.out.println(map .get("jack"));
Map.Entry<String, Integer> entry = map.lowerEntry("jack");// 找到第一个比指定的key小的key
String s = map.lastKey();// 找到第一个比指定的key小的值
Map.Entry<String, Integer> entry1 = map.floorEntry("jack");// 找到第一个小于或等于指定key的值
String jack1 = map.floorKey("jack");// 找到第一个小于或等于指定key的key
Map.Entry<String, Integer> entry2 = map.ceilingEntry("jack");// 找到第一个大于或等于指定key的值
String jack = map.ceilingKey("jack");//找到第一个大于或等于指定key的key
Map.Entry<String, Integer> entry3 = map.higherEntry("jack");// 找到第一个大于指定key的值
String jack2 = map.higherKey("jack");// 找到第一个大于指定key的key
Map.Entry<String, Integer> entry4 = map.firstEntry();// 获取最小值
Map.Entry<String, Integer> entry5 = map.lastEntry();// 获取最大值
Map.Entry<String, Integer> entry6 = map.pollFirstEntry();// 删除最小的元素
Map.Entry<String, Integer> entry7 = map.pollLastEntry();// 删除最大的元素
NavigableMap<String, Integer> stringIntegerNavigableMap = map.descendingMap();//返回一个倒序的Map
NavigableSet<String> strings = map.navigableKeySet() ;// 返回一个Navigable的key的集合,NavigableSet和NavigableMap类似
NavigableSet<String> strings1 = map.descendingKeySet();// 对上述集合倒序
System.out.println(entry2 );
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator .hasNext() ){
Map.Entry<String, Integer> next = iterator.next();
System.out.println( "key:"+next .getKey()+" value:"+next .getValue() );
}
//借助类提供的比较方法
TreeMap <Student,Integer > map1 =new TreeMap<>() ;
map1 .put(new Student("alice",12),100 ) ;
map1 .put(new Student("tack",5),25 ) ;
Iterator<Map.Entry<Student, Integer>> iterator1 = map1.entrySet().iterator();
while (iterator1 .hasNext() ){
Map.Entry<Student, Integer> next = iterator1.next();
System.out.println("key:"+next .getKey()+" value:"+next .getValue() );
}
//借助外比较器
IntergerCom com=new IntergerCom() ;
TreeMap <Integer ,Integer > map2 =new TreeMap< >(com ) ;
map2 .put(12,35);
map2 .put(13,65);
map2 .put(5,89);
Iterator<Map.Entry<Integer, Integer>> iterator2 = map2.entrySet().iterator();
while (iterator2 .hasNext() ){
Map.Entry<Integer, Integer> next = iterator2.next();
System.out.println("key:"+next .getKey() +" value:"+next .getValue() );
}
}
}