集合(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是如何保证元素的排序和唯一的?
答:底层数据结构是红黑树(红黑树是一种自平衡的二叉树)


浙公网安备 33010602011771号