Java TreeMap 集合

Java TreeMap 集合


TreeMap

  • 繼承自 AbstractMap

  • 以鍵值對形式存儲元素

  • 鍵不可重複,值可以重複

  • TreeSet 集合是線程不安全的

  • 底層是二叉樹結構

  • TreeSet 可以對集合內的元素進行排序

    • 系統類默認自然排序
    • 自定義類
      • 實現 Comparable 接口,重寫 compareTo 方法
      • 創建集合對象時,傳遞Comparator的匿名內部類對象(重寫compare方法)

自定義類

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 int compareTo(Product o) {
        int i = this.price - o.price;

        // 如果價格一樣,商品名稱也一樣視爲相同的商品,不能添加
        return i == 0 ? this.name.compareTo(o.name) : i;
    }

}

使用方法

  • 添加元素

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>();
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      for(Entry<Product, Integer> kv : tm.entrySet()) {
          System.out.println(kv.getKey() + " 數量:" + kv.getValue());
      }
    • 運行結果
      這裏寫圖片描述

  • 修改元素

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>();
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      // 修改空調的價格爲2500,數量爲10
      
      for(Entry<Product, Integer> kv : tm.entrySet()) {
          Product p = kv.getKey();
          if("空調".equals(p.getName())) {
              // 必須先修改TreeMap中的值,如果先修改商品價格,那麼,再put時就不是修改,而是添加,因爲是兩個不同的商品
              tm.put(p, 10);
              p.setPrice(2500);
              // 修改完成後,必須break,否則在下一次遍歷時會引發 “併發修改異常”
              break;
          }
      }
      
      for(Entry<Product, Integer> kv : tm.entrySet()) {
          System.out.println(kv.getKey() + " 數量:" + kv.getValue());
      }
    • 運行結果
      這裏寫圖片描述

  • 獲得元素

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>();
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      // 獲得熱水器的數量
      int count = tm.get(new Product("熱水器", 1300));
      System.out.println("get(Object key) :" + count);
      
      // 返回一個與此映射中的最小鍵關聯的鍵-值映射關係
      Entry<Product, Integer> firstKV = tm.firstEntry();
      System.out.println("firstEntry() : key=" + firstKV.getKey() + " value=" + firstKV.getValue());
      
      // 返回與此映射中的最大鍵關聯的鍵-值映射關係
      Entry<Product, Integer> lastKV = tm.lastEntry();
      System.out.println("lastEntry() : key=" + lastKV.getKey() + " value=" + lastKV.getValue());
      
      // 返回此映射中當前第一個(最低)鍵
      Product firstProduct = tm.firstKey();
      System.out.println("firstKey() :" + firstProduct);
      
      // 返回映射中當前最後一個(最高)鍵
      Product lastProduct = tm.lastKey();
      System.out.println("firstKey() :" + lastProduct);
    • 運行結果
      這裏寫圖片描述

  • 移除元素

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>();
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      // 移除集合中的商品
      tm.remove(new Product("電視", 1500));
      
      for(Entry<Product, Integer> kv : tm.entrySet()) {
          System.out.println(kv.getKey() + " 數量:" + kv.getValue());
      }
      
      System.out.println("----------------");
      // 移除集合中所有的元素
      tm.clear();
      System.out.println(tm.size());
    • 運行結果
      這裏寫圖片描述

  • 判斷相關

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>();
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      // 判斷是否包含指定的鍵
      boolean result = tm.containsKey(new Product("洗衣機", 2000));
      System.out.println("containsKey(Object key) :" + result);
      
      // 判斷是否包含指定的值
      result = tm.containsValue(10);
      System.out.println("containsValue(Object value) :" + result);
      
      // 判斷集合是否爲空
      result = tm.isEmpty();
      System.out.println("isEmpty() :" + result);
    • 運行結果
      這裏寫圖片描述

集合元素排序

  • 實現Comparable接口,在上面的示例中已經使用到。

  • 創建集合對象時,傳入 Comparator 匿名子類對象

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>(new Comparator<Product>() {
      
          @Override
          public int compare(Product o1, Product o2) {
      
              int i = o1.getPrice() - o2.getPrice(); // 價格爲主要比較條件
              return i == 0 ? o1.getName().compareTo(o2.getName()) : i; // 名稱爲次要比較條件
          }
      });
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      for(Entry<Product, Integer> kv : tm.entrySet()) {
          System.out.println(kv.getKey() + " 數量:" + kv.getValue());
      }
    • 運行結果
      這裏寫圖片描述

遍歷集合元素

  • keySet

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>();
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      Set<Product> keySet = tm.keySet();
      for(Product p : keySet) {
          System.out.println("key=" + p + " value=" + tm.get(p));
      }
    • 運行結果
      這裏寫圖片描述

  • entrySet

    • 示例

      TreeMap<Product, Integer> tm = new TreeMap<>();
      
      tm.put(new Product("電冰箱", 1000), 3);
      tm.put(new Product("電視", 1500), 4);
      tm.put(new Product("洗衣機", 2000), 2);
      tm.put(new Product("空調", 1500), 3);
      tm.put(new Product("熱水器", 1300), 5);
      
      for(Entry<Product, Integer> entry : tm.entrySet()) {
          System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());
      }
    • 運行結果
      這裏寫圖片描述

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