我这里使用的是Treeset存储的学生信息,定义了学生类,对学生信息进行一个排序:
方法一
对象排序的的方法是,让元素所属类实现 Comparable 接口 ,重写 comparaTo(To) 方法
方法二
Treeset中 使用匿名类的方法传递一个比较器Comparator接口
下面看代码:两种写法,看后面的实现方法!
首先定义一个学生类:
public class Student{
private int age;//年龄
private String name;//姓名
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数初始化
public Student(int age, String name) {
this.age = age;
this.name = name;
}
//重写toString()方法 打印对象信息方便
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
测试类:
import com.ListTest.Student;
import java.util.TreeSet;
public class Test01{
public static void main(String[] args) {
//使用TreeSet存储学生对象
TreeSet<Student> ts=new TreeSet<>();
Student s1=new Student(22,"李白");
Student s2=new Student(12,"鲁班");
Student s3=new Student(18,"瑶");
Student s4=new Student(19,"安琪拉");
Student s5=new Student(19,"貂蝉");
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(Student stu:ts){
System.out.println(stu.toString());
}
}
}
如果我们直接这样运行的话,会报错的。下面我们来实现以下排序
方法一:
如下:测试类不变,Student 类实现接口重写 comparaTo(To)方法
public class Student implements Comparable<Student>{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
//重写方法
@Override
public int compareTo(Student s) {
//this 对象是当前准备存储的对象 s的对象是上一个
int num=this.age-s.age;
//如果两个对象的年龄一样的话 ,名字按照字典序排序
return num==0?this.name.compareTo(s.name):num;
}
}
方法二:
Student 类不变,在测试类中,Treeset中 传递一个比较器
测试类代码如下:
import com.ListTest.Student;
import java.util.Comparator;
import java.util.TreeSet;
public class ComparableDemo01 {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2){
int num=s1.getAge()-s2.getAge();
int num2= num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
Student s1=new Student(22,"李白");
Student s2=new Student(12,"鲁班");
Student s3=new Student(18,"瑶");
Student s4=new Student(19,"安琪拉");
Student s5=new Student(19,"貂蝉");
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(Student stu:ts){
System.out.println(stu.toString());
}
}
}
运行结果都是: