一、TreeSet定义
TreeSet同样是基于TreeMap实现的,我们知道TreeMap是一个有序的二叉树,那么同理TreeSet同样也是一个有序的,它的作用是提供有序的Set集合。通过源码我们知道TreeSet基础AbstractSet,实现NavigableSet、Cloneable、Serializable接口。其中AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。NavigableSet是扩展的 SortedSet
,具有了为给定搜索目标报告最接近匹配项的导航方法,这就意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。Cloneable支持克隆,Serializable支持序列化。
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable同时在TreeSet中定义了如下几个变量。
private transient NavigableMap<E,Object> m; //PRESENT会被当做Map的value与key构建成键值对private static final Object PRESENT = new Object();
构造方法摘要 | |
---|---|
TreeSet()
构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。 | |
TreeSet(Collection<? extends E> c)
构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。 | |
TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。 | |
TreeSet(SortedSet<E> s)
构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。 |
TreeSet使用细节
1、TreeSet()是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。
2、Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆写相应的compareTo()函数,才可以正常使用。
3、同时也可以创建comparator比较器,对其中的compare()函数进行覆写,使得TreeSet按照一定的规则来排序
实现comparable接口
- public class TreeSetTest {
- public static void main(String args[]){
- Persontest per1 = new Persontest("zhangsan", 33);
- Persontest per2 = new Persontest("lisi", 33);
- Persontest per3 = new Persontest("wangwu", 22);
- Persontest per4 = new Persontest("zhaoliu", 44);
- TreeSet treeSet=new TreeSet();
- treeSet.add(per1);
- treeSet.add(per2);
- treeSet.add(per3);
- treeSet.add(per4);
- Iterator iterator=treeSet.iterator();
- while(iterator.hasNext()){
- Persontest t=(Persontest) iterator.next();
- System.out.println(t.getName()+"的年纪是"+t.getAge());
- }
- }
- }
- class Persontest implements Comparable{
- private String name;
- private int age;
- public void setName(String name){
- this.name = name;
- }
- public void setAge(int age){
- this.age = age;
- }
- public String getName(){
- return this.name;
- }
- public int getAge(){
- return this.age;
- }
- public Persontest(String name, int age){
- this.name = name;
- this.age = age;
- }
- public int compareTo(Object obj){
- Persontest per = (Persontest) obj;
- if(per.age < this.age){
- return -1;
- }
- if(per.age > this.age){
- return 1;
- }
- if(per.age == this.age){
- return this.name.compareTo(per.name);
- }
- return 0;
- }
- }
实现comparator接口
- // 需要在类中新建一个自己的比较器
- public class TreeSetTest2 {
- public static void main(String args[]){
- TreeSet ts = new TreeSet(new Human.Comp());
- ts.add(new Human("zhangsan", 33));
- ts.add(new Human("lii", 44));
- ts.add(new Human("wangwu", 33));
- ts.add(new Human("zhuliu", 55));
- Iterator it = ts.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
- }
- class Human{
- private String name;
- private int age;
- public Human(String name, int age){
- this.name = name;
- this.age = age;
- }
- public String toString(){
- return "姓名:"+name+" 年龄:"+age;
- }
- static class Comp implements Comparator{
- public int compare(Object ob1, Object ob2){
- Human h1 = (Human)ob1;
- Human h2 = (Human)ob2;
- int result = h1.age > h2.age ? 1 :(h1.age == h2.age ? 0 : -1);
- if(result == 0){
- result = h1.name.compareTo(h2.name);
- }
- return result;
- }
- }