import java.util.Set;
import java.util.TreeSet;

/**
*1、TreeSet集合底层实际上是一个TreeMap
*2、TreeMap集合底层是一个二叉树。
*3、放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了。
* TreeSet集合存储元素特点:
*     1、无序不可重复的,但是存储的元素可以自动按照大小顺序排序!
*     称为:可排序集合。
*
*     2、无序:这里的无序指的是存进去的顺序和取出来的顺序不同。并且没有下标。
 */
public class TreeSetTest {
    public static void main(String[] args) {
        Set<Integer> str=new TreeSet<>();

        str.add(4);
        str.add(1);
        str.add(3);
        str.add(4);

        for (Integer s:str) {
            System.out.println(s);
        }
/*
数据库中有很多数据:
    userid  name     birth
    -------------------------------------
    1       zs          1980-11-11
    2       ls          1980-10-11
    3       ww          1981-11-11
    4       zl          1979-11-11

    编写程序从数据库当中取出数据,在页面展示用户信息的时候按照生日升序或者降序。
    这个时候可以使用TreeSet集合,因为TreeSet集合放进去,拿出来就是有顺序的。
 */
    }
}

 

自动排序结果:

java swing jtree 针对节点进行时间 java中的treeset_java

import java.util.Set;
import java.util.TreeSet;

/**
 * 对自定义的类型来说,TreeSet可以排序吗?
 *     以下程序中对于Person类型来说,无法排序。因为没有指定Person对象之间的比较规则。
 *     谁大谁小并没有说明啊。
 *
 *     以下程序运行的时候出现了这个异常:
 *         java.lang.ClassCastException:
 *             class com.bjpowernode.javase.collection.Person
 *             cannot be cast to class java.lang.Comparable
 *     出现这个异常的原因是:
 *         Person类没有实现java.lang.Comparable接口。
 */
public class TreeSetTest02 {
    public static void main(String[] args) {
        Person p=new Person(24);
        Person p1=new Person(22);
        Person p2=new Person(20);

        Set<Person> persons=new TreeSet<>();
        persons.add(p);
        persons.add(p2);
        persons.add(p1);

        for (Person ps:persons) {
            System.out.println(ps);
        }
    }

}

class Person{
    int age;
    public Person(){

    }
    public Person(int age){
        this.age=age;
    }

    //重写toString方法
    @Override
    public String toString() {
        return "Person[age="+age+"]";
    }
}

 

import java.util.Set;
import java.util.TreeSet;

/**
 * // 对于自定义类型的TreeSet集合,放在TreeSet集合中的元素需要实现java.lang.Comparable接口。
 * // 并且实现compareTo方法。equals可以不写。
 */
public class TreeSetTest03 {
    public static void main(String[] args) {
        Persons p=new Persons(20);
        Persons p1=new Persons(15);
        Persons p3=new Persons(21);

        Set<Persons> ps=new TreeSet<>();
        ps.add(p);
        ps.add(p1);
        ps.add(p3);

        for (Persons pp:ps) {
            System.out.println(pp);
        }
    }
}

class Persons implements Comparable<Persons>{
    int age;

    public Persons(int age) {
        this.age = age;
    }


    //重写compareTo()方法
    // 需要在这个方法中编写比较的逻辑,或者说比较的规则,按照什么进行比较!
    // k.compareTo(t.key)
    // 拿着参数k和集合中的每一个k进行比较,返回值可能是>0 <0 =0
    // 比较规则最终还是由程序员指定的:例如按照年龄升序。或者按照年龄降序。
    /*
    compareTo方法的返回值很重要:
        返回0表示相同,value会覆盖。
        返回>0,会继续在右子树上找。【10 - 9 = 1 ,1 > 0的说明左边这个数字比较大。所以在右子树 
        上找。】
        返回<0,会继续在左子树上找。
     */
    @Override
    public int compareTo(Persons p) { // p1.compareTo(p2);
        // this是p1
        // c是p2
        // p1和p2比较的时候,就是this和p比较。
        return p.age-this.age;
    }

    @Override
    public String toString() {
        return "Person[age="+age+"]";
    }
}

 

执行结果如下:

java swing jtree 针对节点进行时间 java中的treeset_比较器_02

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/**
 * TreeSet集合中元素可排序的第二种方式:使用比较器的方式。
 * 最终的结论:
 *     放到TreeSet或者TreeMap集合key部分的元素要想做到排序,包括两种方式:
 *         第一种:放在集合中的元素实现java.lang.Comparable接口。
 *         上一个例子已经实现
 *         第二种:在构造TreeSet或者TreeMap集合的时候给它传一个比较器对象。
 * Comparable和Comparator怎么选择呢?
 *     当比较规则不会发生改变的时候,或者说当比较规则只有1个的时候,建议实现Comparable接口。
 *     如果比较规则有多个,并且需要多个比较规则之间频繁切换,建议使用Comparator接口。
 *
 *     Comparator接口的设计符合OCP原则。
 */
public class TreeSetTest04 {
    public static void main(String[] args) {
        Tutle t1=new Tutle(20);
        Tutle t2=new Tutle(15);
        Tutle t3=new Tutle(10);

        //大家可以使用匿名内部类的方式(这个类没有名字。直接new接口。)
        //这样就不用单独写下面TutleComparator比较器
        /*Set<Tutle> tutle=new TreeSet<>(new Comparator<Tutle>(){
            public int compare(Tutle o1, Tutle o2) {
                return o1.age-o2.age;
            }
        });*/

        // 给构造方法传递一个比较器。在下面需要写一个TutleComparator比较器
        Set<Tutle> tutle=new TreeSet<>(new TutleComparator());
        tutle.add(t1);
        tutle.add(t2);
        tutle.add(t3);

        for (Tutle t:tutle) {
            System.out.println(t);
        }
    }

}


class Tutle{
    int age;

    public Tutle(int age){
        this.age=age;
    }

    @Override
    public String toString() {
        return "Tutle[age="+age+"]";
    }
}


// 单独在这里编写一个比较器
// 比较器实现java.util.Comparator接口。(Comparable是java.lang包下的。Comparator是java.util包下的。)
class TutleComparator implements Comparator<Tutle>{
    @Override
    public int compare(Tutle o1, Tutle o2) {
        return o1.age-o2.age;
    }
}