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