集合框架-TreeSet集合

来源:互联网 发布:白贺翔 java架构师 编辑:程序博客网 时间:2024/06/06 00:24

(3)TreeSet集合

TreeSet类概述

    使用元素的自然顺序对元素进行排序

    或者根据创建set时提供的Comparator进行排序

    具体取决于使用的构造方法

A:底层数据结构是红黑树(是一个自平衡的二叉树)

B:保证元素的排序方式

    a:自然排序(元素具备比较性)

        让元素所属的类实现Comparable接口

    b:比较器排序(集合具备比较性)

        让集合构造方法接收Comparator的实现类对象

C:把我们讲过的代码看一遍即可

package cn.itcast_05;import java.util.TreeSet;/* * TreeSet:能够对元素按照某种规则进行排序。 * 排序有两种方式 * A:自然排序 * B:比较器排序 *  * TreeSet集合的特点:排序和唯一 *  * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。 */public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象// 自然顺序进行排序TreeSet<Integer> ts = new TreeSet<Integer>();// 创建元素并添加// 20,18,23,22,17,24,19,18,24ts.add(20);//自动装箱,可以直接添加ts.add(18);ts.add(23);ts.add(22);ts.add(17);ts.add(24);ts.add(19);ts.add(18);ts.add(24);// 遍历for (Integer i : ts) {System.out.println(i);}}}


--------------------------------------------------------------------------------------------------------------------------

package cn.itcast_06;import java.util.TreeSet;/* * 需求:请按照姓名的长度排序 */public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象TreeSet<Student> ts = new TreeSet<Student>();// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}
package cn.itcast_05;/* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 */public class Student implements Comparable<Student> {        private String name;    private int age;    public Student() {        super();    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public int compareTo(Student s) {        // return 0;        // return 1;        // return -1;        // 这里返回什么,其实应该根据我的排序规则来做        // 按照年龄排序,主要条件        int num = this.age - s.age;        // 次要条件        // 年龄相同的时候,还得去看姓名是否也相同,而姓名是String类型,本身已经实现了Comparable接口,直接拿来用就可以了        // 如果年龄和姓名都相同,才是同一个元素        int num2 = num == 0 ? this.name.compareTo(s.name) : num;        return num2;    }    /*     难点:要做自然排序,就必须去实现Comparable接口,           写主要条件和次要条件代码取决于我给出的排序条件           还要知道次要条件的分析    */}
说明:
public int compareTo(Student  s){     int  num = this.age - s.age;     return num;}
第一次this.age为27、s.age为27



第二次:this.age为29,但s.age还是为27,那么以后的age都和第一次的27来比较了



---------------------------------------------------------------------------------------------------------------------------

package cn.itcast_06;import java.util.TreeSet;/* * 需求:请按照姓名的长度排序 */public class TreeSetDemo {public static void main(String[] args) {// 创建集合对象TreeSet<Student> ts = new TreeSet<Student>();// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}
package cn.itcast_06;/* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 */public class Student implements Comparable<Student> {private String name;private int age;public Student() {super();}public Student(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(Student s) {// 主要条件 姓名的长度int num = this.name.length() - s.name.length();// 姓名的长度相同,不代表姓名的内容相同int num2 = num == 0 ? this.name.compareTo(s.name) : num;// 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄int num3 = num2 == 0 ? this.age - s.age : num2;return num3;}}
---------------------------------------------------------------------------------------------------------------------------
package cn.itcast_07;import java.util.Comparator;import java.util.TreeSet;/* * 需求:请按照姓名的长度排序 *  * TreeSet集合保证元素排序和唯一性的原理 * 唯一性:是根据比较的返回是否是0来决定。 * 排序: *         A:自然排序(元素具备比较性) *             让元素所属的类实现自然排序接口 Comparable *         B:比较器排序(集合具备比较性) *             让集合的构造方法接收一个比较器接口的子类对象 Comparator */public class TreeSetDemo {    public static void main(String[] args) {        // 创建集合对象        // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序        // public TreeSet(Comparator comparator) //比较器排序        // 定义个类比较器        // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());        // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象        // 而匿名内部类就可以实现这个东西,一般开发中用匿名内部类搞定        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {            @Override            public int compare(Student s1, Student s2) {                // 姓名长度                int num = s1.getName().length() - s2.getName().length();                // 姓名内容                int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;                // 年龄                int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;                return num3;            }        });        // 创建元素        Student s1 = new Student("linqingxia", 27);        Student s2 = new Student("zhangguorong", 29);        Student s3 = new Student("wanglihong", 23);        Student s4 = new Student("linqingxia", 27);        Student s5 = new Student("liushishi", 22);        Student s6 = new Student("wuqilong", 40);        Student s7 = new Student("fengqingy", 22);        Student s8 = new Student("linqingxia", 29);        // 添加元素        ts.add(s1);        ts.add(s2);        ts.add(s3);        ts.add(s4);        ts.add(s5);        ts.add(s6);        ts.add(s7);        ts.add(s8);        // 遍历        for (Student s : ts) {            System.out.println(s.getName() + "---" + s.getAge());        }    }}
package cn.itcast_07;import java.util.Comparator;public class MyComparator implements Comparator<Student> {        //一般开发中用匿名内部类搞定,不需要重新定义个类比较器出来    @Override    public int compare(Student s1, Student s2) {        // int num = this.name.length() - s.name.length();        // this -- s1        // s -- s2        // 姓名长度,不在一个类中,用get拿        int num = s1.getName().length() - s2.getName().length();        // 姓名内容        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;        // 年龄        int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;        return num3;    }}
package cn.itcast_07;public class Student {private String name;private int age;public Student() {super();}public Student(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
---------------------------------------------------------------------------------------------------------------------------

下面例子也是用匿名内部类的方法,源自:http://blog.csdn.net/wuya112709/article/details/51407754

public class Studentdemo {public static void main(String[] args) {TreeSet ts1 = new TreeSet(new Comparator() {public int compare(Object o1, Object o2) {Student s1 = (Student) o1;Student s2 = (Student) o2;return s1.age > s2.age ? 1 : -1;}});ts1.add(new Student("mm", 21, 97005));ts1.add(new Student("jerry", 19, 97003));ts1.add(new Student("tom", 16, 97004));ts1.add(new Student("mm", 28, 97008));ts1.add(new Student("mm", 23, 97006));System.out.println("语句return s1.age > s2.age ? 1 : -1;是按照???排列的:");System.out.println(ts1);}}


0 0