集合--TreeSet类比较器排序的实现方式及如何保证元素的排序和唯一性

比较器排序的实现方式

public class Student2 {
    private String name;
    private int age;

    public Student2() {
    }

    public Student2(String name, int age) {
        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 String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

import java.util.Comparator;

//方式1:自己创建一个类实现Comparator接口

public class MyComparetor implements Comparator<Student2> {
    @Override
    public int compare(Student2 o1, Student2 o2) {
        //题目要求:按照姓名的长度进行排序
        int i = o1.getName().length() - o2.getName().length();
        //姓名长度一样不代表姓名的内容一样
        int i2 = i == 0 ? o1.getName().compareTo(o2.getName()) : i;

        //姓名的长度和内容一样,但是年龄可能不一样
        //只有当姓名和年龄都一样的时候,才能判断是同一个人
        int i3 = i2 == 0 ? o1.getAge()-o2.getAge() : i2;

        return i3;
    }
}

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

/*
        根据创建 set 时提供的 Comparator 进行排序
            具体取决于使用的构造方法。

 */
public class TreeSetDemo2 {
    public static void main(String[] args) {

      //方式1:通过匿名对象的方式传参
//        TreeSet<Student2> ts = new TreeSet<Student2>(new MyComparetor());
      
     //方式2:通过匿名内部类的方式
        TreeSet<Student2> ts = new TreeSet<Student2>(new Comparator<Student2>() {
            @Override
            public int compare(Student2 o1, Student2 o2) {
                //题目要求:按照姓名的长度进行排序
                int i = o1.getName().length() - o2.getName().length();
                //姓名长度一样不代表姓名的内容一样
                int i2 = i == 0 ? o1.getName().compareTo(o2.getName()) : i;

                //姓名的长度和内容一样,但是年龄可能不一样
                //只有当姓名和年龄都一样的时候,才能判断是同一个人
                int i3 = i2 == 0 ? o1.getAge()-o2.getAge() : i2;

                return i3;
            }
        });

        //创建学生对象
        Student2 s1 = new Student2("zhujiale",18);
        Student2 s2 = new Student2("caoxintao",17);
        Student2 s3 = new Student2("taohuagen",19);
        Student2 s4 = new Student2("zhangmi",16);
        Student2 s5 = new Student2("caoxintao",19);

        //将学生对象添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        for(Student2 s : ts){
            System.out.println(s);
        }
    }
}

TreeSet是如何保证元素的排序和唯一性的

import java.util.TreeSet;

/*
        TreeSet是如何保证元素的排序和唯一性的
        底层数据结构是红黑树(红黑树是一种自平衡的二叉树)

*/
public class TreeSetDemo3 {
    public static void main(String[] args) {
        TreeSet<Integer> ts = new TreeSet<>();

        ts.add(32);
        ts.add(18);
        ts.add(15);
        ts.add(24);
        ts.add(30);
        ts.add(32);
        ts.add(15);

        for(Integer i : ts){
            System.out.println(i);
        }
    }
}

TreeSet是如何保证元素的排序和唯一性的图解

习题

public class Student implements Comparable<Student>{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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 String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        //题目要求:按照姓名的长度进行排序
        int i = this.name.length() - o.name.length();
        //姓名长度一样不代表姓名的内容一样
        int i2 = i == 0 ? this.name.compareTo(o.name) : i;

        //姓名的长度和内容一样,但是年龄可能不一样
        //只有当姓名和年龄都一样的时候,才能判断是同一个人
        int i3 = i2 == 0 ? this.age-o.age : i2;

        return i3;
    }
}

import java.util.TreeSet;

/*
        需求:使用TreeSet集合存储学生对象,根据姓名的长度进行排序
*/
public class TreeSetDemo {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<Student>();

        //创建学生对象
        Student s1 = new Student("zhujiale",18);
        Student s2 = new Student("caoxintao",17);
        Student s3 = new Student("taohuagen",19);
        Student s4 = new Student("zhangmi",16);
        Student s5 = new Student("caoxintao",19);

        //将学生对象添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        for(Student s : ts){
            System.out.println(s);
        }
    }
}
posted @ 2021-12-23 19:42  赤兔胭脂小吕布  阅读(36)  评论(0编辑  收藏  举报