Java TreeSet 集合

Java TreeSet 集合


TreeSet

  • 继承自 AbstractSet 类

  • 底层是二叉数结构

  • TreeSet是线程不安全的

  • 从JDK1.2开始

  • TreeSet 可以对集合内的元素进行排序

    • 系统类默认自然排序
    • 自定义类
      • 实现 Comparable 接口,重写 compareTo 方法
      • 创建集合对象时,传递Comparator的匿名内部类对象(重写compare方法)

使用方法

  • 添加元素

    • 示例

      TreeSet<Integer> ts = new TreeSet<>();
      
      // 添加指定元素到集合中
      ts.add(10);
      System.out.println("add(E e) :" + ts);
      
      // 将指定 collection 中的所有元素添加到此 set 中
      // 因为ts中已经存在10这个元素,所以会添加失败
      ts.addAll(ts);
      System.out.println("addAll(Collection<? extends E> c) :" + ts);
    • 运行结果
      这里写图片描述

  • 获取元素

    • 示例

      TreeSet<Integer> ts = new TreeSet<>();
      
      for (int i = 1; i <= 5; i++) {
          ts.add(i);
      }
      
      // 返回此 set 中当前第一个(最低)元素
      Integer ele = ts.first();
      System.out.println("first() :" + ele);
      
      // 返回此 set 中当前最后一个(最高)元素
      ele = ts.last();
      System.out.println("last() :" + ele);
      
      // 获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
      ele = ts.pollFirst();
      System.out.println("pollFirst() :" + ele  + "       ts: " + ts);
      
      // 获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
      ele = ts.pollLast();
      System.out.println("pollLast() :" + ele + "        ts: " + ts);
    • 运行结果
      这里写图片描述

  • 移除元素

    • 示例

      TreeSet<Integer> ts = new TreeSet<>();
      
      for (int i = 1; i <= 5; i++) {
          ts.add(i);
      }
      
      // 将指定的元素从 set 中移除(如果该元素存在于此 set 中)
      ts.remove(Integer.valueOf(3));
      System.out.println("remove(Object o) :" + ts);
      
      // 移除此 set 中的所有元素
      ts.clear();
      System.out.println("clear() :" + ts);
    • 运行结果
      这里写图片描述

  • 判断相关

    • 示例

      TreeSet<Integer> ts = new TreeSet<>();
      
      for (int i = 1; i <= 5; i++) {
          ts.add(i);
      }
      
      // 判断集合中是否存在指定元素
      boolean result = ts.contains(Integer.valueOf(3));
      System.out.println("contains(Object o) :" + result);
      
      // 判断集合是否为空
      result = ts.isEmpty();
      System.out.println("isEmpty() :" + result);
    • 运行结果
      这里写图片描述

元素排序

  • 自定义类
// 实现Comparable接口
public class Product implements Comparable<Product>{
    // 商品名称
    private String name;
    // 商品价格
    private int price;

    // 无参构造
    public Product() {}

    // 全参构造
    public Product(String name, int price) {
        super();
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product [name=" + name + ", price=" + price + "]";
    }

    @Override
    public String toString() {
        return "Product [name=" + name + ", price=" + price + "]";
    }

    // 按价格排序-升序
    // 二叉树结构,返回大于0排在左边,小于0排在左边,等于0不添加
    @Override
    public int compareTo(Product o) {
        // this 表示添加的元素
        // o 表示集合中的元素
        int i = this.price - o.price;

        return i == 0 ? 1 : i;
    }
}
  • 实现Comparable接口排序

    • 示例

      TreeSet<Product> ts = new TreeSet<>();
      
      ts.add(new Product("冰箱", 1000));
      ts.add(new Product("洗衣机", 1200));
      ts.add(new Product("空调", 2000));
      ts.add(new Product("电视", 1500));
      ts.add(new Product("音响", 1000));
      
      for(Product p : ts) {
          System.out.println(p);
      }
    • 运行结果
      这里写图片描述

  • 传入Comparator匿名对象排序

    • 示例
    • 如果 Comparator 和 Comparable 同时存在,Comparator 优先

      TreeSet<Product> ts = new TreeSet<>(new Comparator<Product>() {
          @Override
          public int compare(Product o1, Product o2) {
      
              // o1 表示要添加的元素
              // o2 表示集合中的元素
              int i = o1.getPrice() - o2.getPrice();
              return i == 0 ? 1 : i;
          }
      });
      
      ts.add(new Product("冰箱", 1000));
      ts.add(new Product("洗衣机", 1200));
      ts.add(new Product("空调", 2000));
      ts.add(new Product("电视", 1500));
      ts.add(new Product("音响", 1000));
    • 运行结果
      这里写图片描述

遍历元素

  • 将集合转成数组,然后遍历数组中的元素

    • 示例

      TreeSet<Integer> ts = new TreeSet<>();
      
      // 自然排序
      for (int i = 5; i >= 1; i--) {
          ts.add(i);
      }
      
      Integer[] array = ts.toArray(new Integer[ts.size()]);
      for (int i = 0; i < array.length; i++) {
          System.out.println(array[i]);
      }
    • 运行结果
      这里写图片描述

  • foreach 增强 for

    • 示例
      图片
    TreeSet<Integer> ts = new TreeSet<>();
    
    // 自然排序
    for (int i = 5; i >= 1; i--) {
        ts.add(i);
    }
    
    for(Integer i : ts) {
        System.out.println(i);
    }
    • 运行结果
      这里写图片描述
  • Iterator 迭代器

    • 示例

      TreeSet<Integer> ts = new TreeSet<>();
      
      // 自然排序
      for (int i = 5; i >= 1; i--) {
          ts.add(i);
      }
      
      Iterator<Integer> iterator = ts.iterator();
      
      while(iterator.hasNext()) {
          System.out.println(iterator.next());
      }
    • 运行结果
      这里写图片描述

相关内容推荐