比较器排序的实现方式
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);
}
}
}