TreeSet类(概述)

1. TreeSet是SortedSet接口的唯一实现, TreeSet可以确保集合元素处于排序状态.  TreeSet并不是根据元素的插入顺序进行排序,

        而是根据元素实际值来进行排序.(可以确保元素唯一并且元素排序)  TreeSet采用红黑树的数据结构对元素进行排序.


2.TreeSet支持两种排序方法:  自然排序和比较器排序.  默认情况下,TreeSet 采用自然排序.(Integer类型元素自然升序)


3.自然排序:

        TreeSet会调用元素的compareTo(Object obj)方法来比较元素之间大小关系, 然后将集合元素按升序排序,这就是自然排序.

        Java提供了一个comparable接口, 该接口里定义了一个compareTo(Object obj)方法, 该方法返回一个整数值,实现该接口的

        类必须实现该方法,实现了该接口的类的对象就可以比较大小了.

            当一个对象调用该方法与另一个对象进行比较, 例: obj.compareTo(obj2) ,如果该方法返回0, 则这两个对象相等,  返回一

            个正整数则说明obj大于obj2;  返回一个负整数,则说明 obj小于obj2.

4.在向集合添加自定义类对象时,必须实现Comparable接口,并实现compareTo()方法, 否则程序将会出现异常.

        当把一个对象添加到TreeSet集合中的时候,TreeSet的add()方法底层会调用compareTo()方法与集合中的其他元素进行比

         较,然后根据红黑树算法决定它的存储位置,所以向TreeSet集合中添加的应该是同一个类的对象.否则将引发类转换异常.


5.TreeSet集合判断两个对象不相等的标准是: 通过compareTo()方法比较没有返回0,则两个对象不相等.(如果返回0,两个元素相等,则集合不添加相等元素).这个TreeSet确保无重复元素的依据.

    class T implements Comparable{
    
    private int tree;
    
    public T(int tree){
        this.tree=tree;
    }
    
    //重写了compareTo()方法
    public int compareTo(Object obj) {
        
        return 0;
    }
    
    public String toString() {
        return Integer.toString(tree);
    }
    
    
}

public class TreeSetDemo6 {
    
    public static void main(String[] args) {
        
        TreeSet<T> ts=new TreeSet<T>();
        
        ts.add(new T(23));
        ts.add(new T(34));
        ts.add(new T(12));
        ts.add(new T(10));
        
        for(T t: ts) {
            System.out.println(t);
        }
    }

}

分析:在自定义T类中,实现了Comparable接口并实现了compareTo()方法, 该方法总是返回true; 所以当集合添加了第一个 元素之后,再添加其他元素时, 会调用compareTo()方法与第一个元素进行比较, 总是返回0(尽管它们并不是同一个对象); 所以集合判断它们都为相同元素,所以不添加之后的任何元素.


6.比较器排序

        TreeSet的构造方式不同,排序的方式也不同.

        比较器排序:  public TreeSet(Comparator<E> comparator)

                                两种方式:1)自定义一个类,该类实现Comparator接口,重写Comparator接口中的compare()方法
                                             2)直接使用接口匿名内部类的方式实现
              

        


            




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值