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()); }
运行结果