【java集合】TreeMap集合

【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() );
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值