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()); }
運行結果