TreeMap研究,如何给TreeMap传入比较器?

最近心血来潮,决定好好研究一下java的集合框架:

于是有了如下代码,看起来有点乱,但是写的过程中还摸清楚了很多问题。

1、 TreeMap的底层实现原理,基于红黑树的,有序。

2、默认采用升序,根据entry(key,value)中的key来确定先后顺序,假如你传入的key是int类型的,那么key越大,对应的entry越靠后。

3、存放进TreeMap的每一个元素是entry,要求key的类型一致,如果不一致会报错的。

4、采用红黑树有什么好处呢?红黑树是一种平衡树,查找的性能是介于数组和链表之间。

package com.miller.datastructure.precious;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeMap;

/**
 * @program: data-structure
 * @description: test
 * @author: Miller.FAN
 * @create: 2019-09-26 13:40
 **/

public class TreeMapTest {

    public static void main(String[] args) {

        TreeMap treeMap = new TreeMap();
        //底层实现原理,红黑树  默认升序,且根据key的顺序

        treeMap.put(1,5);
        treeMap.put(2,8);
        treeMap.put(3,1);
        treeMap.put(5,9);
        treeMap.put(4,6);
        //如果key相同覆盖前value
        //treeMap.put(3,9);
        //key 的类型不统一会抛出异常
        //treeMap.put("full","sum");
        System.out.println("输出value数组: " + treeMap.values());
        Object value = treeMap.get(3);
        System.out.println("查找结果: " + value);

        //test2 new 时传入一个Comparator
        TreeMap treeMap1 = new TreeMap(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return  o1 < o2 ? 1:-1;
            }
        });

        treeMap1.put(1,3);
        treeMap1.put(2,4);
        treeMap1.put(4,1);
        treeMap1.put(3,8);
        System.out.println("treeMap1输出value数组: " + treeMap1.values());

        //传入比较器时,要考虑以哪一个值作为返回值比较好
        TreeMap treeMap3 = new TreeMap(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int number = o1.getAge() - o2.getAge();
                return 0 < number ? 1:-1;
            }
        });
        //事实证明这个比较器关注的重点应该放在即将放入TreeMap中的entry的KEY是,对KEY类型做比较处理
        TreeMap treeMap2 = new TreeMap(
                new Comparator<Integer>() {
                    @Override
                    public int compare(Integer o1, Integer o2) {
                        return  o1 < o2 ? 1:-1;
                    }
                }
        );

        Student student1 = new Student(1,"fengzhenbiao", 32);
        Student student2 = new Student(2,"boluo",31);
        Student student3 = new Student(3,"miller",15);
        treeMap2.put(student1.getAge(),student1);
        treeMap2.put(student2.getAge(),student2);
        treeMap2.put(student3.getAge(),student3);
        Iterator<Student> it =  treeMap2.entrySet().iterator();
        while(it.hasNext()) {
            Object s = it.next();
            System.out.println("打印entity:" + s.toString());
        }


        //那么实体类能不能做KEY呢?
        TreeMap treeMap_entity = new TreeMap(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return 0 > (o1.hashCode() - o2.hashCode()) ? 1:-1;
            }
        });
        Student u1 = new Student(5,"bule",67);
        Student u2 = new Student(6,"red",45);
        Student u3 = new Student(3,"black",32);
        treeMap_entity.put(u1,1);
        treeMap_entity.put(u2,3);
        treeMap_entity.put(u3,2);
        Iterator<Student> its =  treeMap_entity.entrySet().iterator();
        while(its.hasNext()) {
            Object s = its.next();
            System.out.println("打印####:" + s.toString());
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值