集合(17):set接口的子类----TreeSet类的练习

集合(17):set接口的子类----TreeSet类的练习

1、使用TreeSet集合存储学生对象,根据姓名的长度进行排序(自然排序)

定义学生类

//学生类需要实现Comparable接口
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 +
                '}';
    }

    //遍历学生信息的时候需要重写compareTo方法
    //compareTo方法的返回值确定学生信息怎么存储
    @Override
    public int compareTo(Student o) {
        //题目要求:按照姓名的长度进行排序
        //o.name.length();是需要比较的那个字符串长度
        int i = this.name.length() - o.name.length();//两者的长度相减

        //姓名长度一样但姓名的内容可能不一样,还得再加入判断
        //用i2来接收一个三目运算符
        //如果i等于0,说明姓名长度一样,就比较姓名的内容this.name.compareTo(o.name)
        //如果i不等于0,说明姓名的长度不一样,那就不需要再比较内容,直接将i赋给i2
        int i2 = i == 0 ? this.name.compareTo(o.name) : i;

        //姓名的长度和内容一样,但是年龄可能不一样,还得再加入判断
        //只有当姓名和年龄都一样的时候,才能判断是同一个人
        //如果i2等于0,说明姓名的长度和内容一样,那就比较年龄this.age-o.age
        //如果i2不等于0,说明姓名内容不一样,那不需要再比较年龄,直接将i2赋给i3
        int i3 = i2 == 0 ? this.age-o.age : i2;

        return i3;
    }
}

定义测试类

import java.util.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循环遍历
        for(Student s : ts){
            System.out.println(s);
        }
    }
}

            执行结果如下:
                        Student{name='zhangmi', age=16}
                        Student{name='zhujiale', age=18}
                        Student{name='caoxintao', age=17}
                        Student{name='caoxintao', age=19}
                        Student{name='taohuagen', age=19}

                        Process finished with exit code 0

2、根据创建 set 时提供的 Comparator 进行排序,根据姓名的长度进行排序

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

定义学生类

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 +
                '}';
    }
}

定义自己的一个比较器

因为学生类中没有实现接口和重写方法,所有在比较器中要实现接口和重写方法

返回值的内容和案例1一样

因为此案例比较器和学生类不在同一个类中,所以获取name和age要用get方法

import java.util.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.TreeSet;
public class TreeSetDemo2 {
    public static void main(String[] args) {
        //根据此题目需求,构造方法需要我们手动传参
        TreeSet<Student2> ts = new TreeSet<>(new MyComparetor());

        //创建学生对象
        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);
        }
    }
}

            执行结果如下:
                        Student{name='zhangmi', age=16}
                        Student{name='zhujiale', age=18}
                        Student{name='caoxintao', age=17}
                        Student{name='caoxintao', age=19}
                        Student{name='taohuagen', age=19}

                        Process finished with exit code 0

3、TreeSet是如何保证元素的排序和唯一的?

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

image

posted @ 2021-12-30 15:47  阿伟宝座  阅读(44)  评论(0)    收藏  举报