Java TreeSet类

TreeSet是SortedSet接口的实现,元素不论以什么元素插入,在遍历的时候,都会以天然顺序遍历。

TreeSet基于TreeMap的NavigableSet实现,使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。 

构造方法

TreeSet() 
  构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。 
TreeSet(Collection<? extends E> c) 
  构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。 
TreeSet(Comparator<? super E> comparator) 
  构造一个新的空 TreeSet,它根据指定比较器进行排序。 
TreeSet(SortedSet<E> s) 
  构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。 

TreeSet是带排序的,所以想要为TreeSet增加自定义类型,必须指定排序规则

方法

E ceiling(E e) 
  返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。 
Comparator<? super E> comparator() 
  返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null。 
Iterator<E> descendingIterator() 
  返回在此 set 元素上按降序进行迭代的迭代器。 
NavigableSet<E> descendingSet() 
  返回此 set 中所包含元素的逆序视图。 
E first() 
  返回此 set 中当前第一个(最低)元素。 
E floor(E e) 
  返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null。 
SortedSet<E> headSet(E toElement) 
  返回此 set 的部分视图,其元素严格小于 toElement。 
NavigableSet<E> headSet(E toElement, boolean inclusive) 
  返回此 set 的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement。 
E higher(E e) 
  返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null。 
Iterator<E> iterator() 
  返回在此 set 中的元素上按升序进行迭代的迭代器。 
E last() 
  返回此 set 中当前最后一个(最高)元素。 
E lower(E e) 
  返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null。 
E pollFirst() 
  获取并移除第一个(最低)元素;如果此 set 为空,则返回 null。 
E pollLast() 
  获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null。 
NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) 
  返回此 set 的部分视图,其元素范围从 fromElement 到 toElement。 
SortedSet<E> subSet(E fromElement, E toElement) 
  返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。 
SortedSet<E> tailSet(E fromElement) 
  返回此 set 的部分视图,其元素大于等于 fromElement。 
NavigableSet<E> tailSet(E fromElement, boolean inclusive) 
  返回此 set 的部分视图,其元素大于(或等于,如果 inclusive 为 true)fromElement。 

Comparator排序规则

代码如下:

public class Test {
 public static void main(String[] args) {
 TreeSet set = new TreeSet(new PersonComparator());
 set.add(new Person("lwc", 80));
 set.add(new Person("nxj", 70));
 set.add(new Person("lp", 60));
 set.add(new Person("fy", 75));
 Iterator ite = set.iterator();
 while (ite.hasNext()) {
 Person p = (Person)ite.next();
 System.out.println(p.name);
 }
 }
}
class Person {
 String name;
 int score;

 public Person(String name, int score) {
 this.name = name;
 this.score = score;
 }
}
class PersonComparator implements Comparator {
 public int compare(Object o1, Object o2) {
 Person p1 = (Person) o1;
 Person p2 = (Person) o2;
 return p1.score - p2.score;
 }
}

例子

public static void main(String[] args) {
//      test1();
 test2();
}
/**
 * 自然排序
 */
private static void test1() {
 TreeSet<String> treeSet=new TreeSet<String>();
 treeSet.add("a");
 treeSet.add("d");
 treeSet.add("b");
 treeSet.add("e");
 treeSet.add("c");

 for (String string : treeSet) {
 System.out.println(string);
 }
}
/**
 * 
 * TreeSet添加自定义对象时满足其一 ①构造时传入比较器 ②实现Comparable接口并重写compare方法,否则抛出异常
 *  java.lang.ClassCastException:
 *  com.yu.bean.Info cannot be cast to java.lang.Comparable
 */
private static void test2() {
 TreeSet<Info> infosSet =new TreeSet<Info>(new Comparator<Info>() { // 传入比较器,保证顺序

 @Override
 public int compare(Info o1, Info o2) {
 int num=o1.getId()-o2.getId();
 num = num==0?o1.hashCode()-o2.hashCode():num;
 return num;
 }
 }) ;

 infosSet.add(new Info(0, "qqq"));
 infosSet.add(new Info(1, "wew"));
 infosSet.add(new Info(3, "ete"));
 infosSet.add(new Info(2, "bjk"));
 infosSet.add(new Info(1, "wew")); // 重复元素,compare方法返回0,不会被插入到TreeSet

 for (Info info : infosSet) {
 System.out.println(info);
 }
//      output:
//      Info [id=0, adress=qqq]
//      Info [id=1, adress=wew]
//      Info [id=2, adress=bjk]
//      Info [id=3, adress=ete]
//  可以看出,Comparator保证了元素的有序性,重复元素将不会被添加到TreeSet
}

总结

1. 基于TreeMap实现的SortedSet 
2. 排序后按升序排列元素 
3. 非线程安全 

精彩推荐