首页 > 代码库 > 初识java集合——树集

初识java集合——树集

*TreeSet与HashSet相比,树集是有序集合,对树集遍历,每个值将自动按照排序顺序呈现。
* TreeSet当前使用的是红黑树,每次将一个元素添加到树中时,都将被放置正确的位置之中
*
* 在TreeSet中添加元素的速度要快于数组和链表,但慢于散列表(HashSet)
*
* TreeSet在默认情况下,假定插入的元素实现了Comparable接口,该接口值返回负数,表明a位于b之前
*
* public interface Comparable<T>
* {
* int compareTo( T other);
* }
*
* 使用Comparable接口定义的排序有其局限性
* 如果要插入自定义的对象,就必须实现Comparable接口定义排列顺序
* 这里有一个问题需要思考,如果在一个集合中需要按照某一种规则,在另外一个集合却使用另一种规则
* 而如果要对一个类的对象进行排序,该类并没有实现Comparable接口,这时候怎么办?
*
* 此时,可以将Comparator对象传递给TreeSet的构造器来告诉使用该种排列规则
*
* public interface Comparator<T>
* {
* int compara(T a, T b);
* }
*

 1 //例子
 2 class  myComparator implements Comparator<String>{
 3 
 4     @Override
 5     public int compare(String o1, String o2) {
 6         if (o1.length() > o2.length()) {
 7             return 1;
 8         }else if( o1.length() < o1.length()){
 9             return -1;
10         }else{
11             return 0;
12         }
13     }
14 };
15 
16 //然后将构造的比较器传入
17 myComparator my = new myComparator();
18 TreeSet<String> tree = new TreeSet<>(my);

 


* 如果按照描述信息进行排序就如 例子一样, 然后将类的对象传递树集的构造器,这样就构造了一颗带比较的树
* 注意到,这个比较器没有任何数据,它只是比较方法的持有器(有时将这种对象称为函数对象)
* 函数对象通常动态定义,即常常用匿名内部类,如例子2
*

//例子2
TreeSet<Student> stuTree = new TreeSet<Student>(new Comparator<Student>(){
    @Override
    public int compare(Student o1, Student o2) {
        if (o1.getBook().getPrice() > o2.getBook()
                .getPrice()) {
            return -1;
        } else if (o1.getBook().getPrice() < o2
                .getBook().getPrice()) {
            return 1;
        } else {
            return 0;
        }
    }
});

 


* 如果不需要进行排序,那么没必要为排序开销,对于某些数据来说,对其排序比散列函数更加困难
*

初识java集合——树集