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());
      }
    • 運行結果
      這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章