TreeMap 和 TreeSet

TreeMap 和 TreeSet

概述

  1. TreeSet集合底层实际上是一个TreeMap
  2. TreeMap集合底层是一个二叉树
  3. 放到TreeSet集合中的元素,等同于放到TreeMap集合的key部分
  4. TreeSet集合中的元素: 无序不可重复, 但是可以根据元素的大小自动排序, 称为: 可排序集合
  5. TreeSet/TreeMap集合是自平衡二叉树,遵循左小右大的存放原则,存的时候是要进行比较的
  6. 放在TreeSet中的元素需要实现 java.lang.Comparable 接口, 并且实现compareTo 方法,equals方法可以不用重写
  7. 除了实现 java.lang.Comparable 接口,还可以在创建TreeSet集合时,传入比较器,比较器需实现java.util.Comparator接口,并实现里面的compare方法
  8. 如果即实现了java.lang.Comparable 接口 ,也传入比较器,根据的是比较器的规则

二叉树

static final class Entry<K,V> implements Map.Entry<K,V> {    
    K key;    
    V value;    
    Entry<K,V> left;   //左节点内存地址 
    Entry<K,V> right;   //右节点内存地址 
    Entry<K,V> parent;    //父节点内存地址
    boolean color = BLACK;
}
  • 二叉树的三种遍历方式:

    1. 前序遍历 : 根左右
    2. 中序遍历 : 左根右
    3. 后序遍历 : 左右根
  • 注意 : 前中后说的是 "根" 的位置, 根在前面是前序, 根在中间是中序 , 根在后面是后序

  • TreeSet/TreeMap集合采用的是 : 中序遍历方式

  • 100 200 50 60 80 120 140 130 135 180 666 45 55

    45 50 55 60 80 100 120 130 135 140 180 200 666

public class TreeMapTest {
    public static void main(String[] args) {
        /** 1. TreeSet集合底层实际上是一个TreeMap
         * 2. TreeMap集合底层是一个二叉树
         * 3. 放到TreeSet集合中的元素,等同于放到TreeMap集合的key部分
         * 4. TreeSet集合中的元素: 无序不可重复, 但是可以根据元素的大小自动排序, 称为: 可排序集合
         */
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("jqc1");
        treeSet.add("jqc2");
        treeSet.add("jqc4");
        treeSet.add("jqc3");
        treeSet.add("jqc1");
        for (String s : treeSet) {
            System.out.println(s);
        }
        //Pig类实现java.lang.Comparable接口
        TreeSet<Pig> pigs = new TreeSet<>();
        pigs.add(new Pig(100));
        pigs.add(new Pig(200));
        pigs.add(new Pig(100));
        pigs.add(new Pig(500));
        pigs.add(new Pig(150));
        for (Pig pig : pigs) {
            System.out.println(pig);//Pig{age=100} Pig{age=150} Pig{age=200} Pig{age=500}
        }
        //在创建TreeSet集合时,传入比较器
        TreeSet<Cat> cats = new TreeSet<>(new MyComparetor());
        cats.add(new Cat(100));
        cats.add(new Cat(50));
        cats.add(new Cat(70));
        cats.add(new Cat(50));
        for (Cat cat : cats) {
           System.out.println(cat);//Cat{age=50} Cat{age=70} Cat{age=100}
        }
    };
}
class Pig implements Comparable<Pig>{
    Integer age;

    public Pig(Integer age) {
        this.age = age;
    }

    @Override
    public int compareTo(Pig o) {
        return this.age - o.age;
    }

    @Override
    public String toString() {
        return "Pig{" +
                "age=" + age +
                '}';
    }
}
class Cat {
    Integer age;

    public Cat(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "age=" + age +
                '}';
    }
}
class MyComparetor implements Comparator<Cat>{
    @Override
    public int compare(Cat o1, Cat o2) {
        return o1.age - o2.age;
    }
}
posted @ 2020-12-14 23:51  阿灿呀  阅读(213)  评论(0)    收藏  举报