目录
问题描述:在Java中使用TreeSet构建集合对象时,提供带参构造与无参构造两种构造方式,无参构造方式提供默认自然排序,带参构造的参数类型为Comparator e类型,无参构造方式可通过重写CompareTo方法,带参构造可以通过匿名内部类的方式使集合中数据按照自身需求进行排序。
在讲述两种构造方法前,先定义一个“学生类“
public class 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;
}
}
一.无参构造方法——重写CompareTo方法
例:将集合中的学生对象按年龄升序排列。
1.定义一个”新学生类“继承上述”学生类“,实现Comparable接口,同时重写CompareTo方法
public class newStudent extends Student implement Comparable<newStudent>{
@Override
public int compareTo(newStudent s) {
int num1 = this.age - s.age; //按年龄升序排列
int num2 = num1==0?this.name.compareTo(s.name):num1; //年龄相同情况下按照姓名排序
return num2;
}
升序与降序的改变可以通过调换带有注释的代码行被减数与减数的位置来改变,具体操作结果可以复制代码到编译器中运行得到。
2..定义一个java类用于测试上述重写的CompareTo方法(下边先给出构造方法,测试类中其他代码为共性代码,文章末尾统一给出)
TreeSet<newStudent> ts = new TreeSet<newStudent>();
二.带参构造方法——匿名内部类
例:将集合中的学生对象按照年龄的升序排列
使用带参构造方法创建集合对象,同时采用匿名内部类的方式重写CompareTo方法,使集合中元素按照自身需求排序。
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num1 = s1.getAge() - s2.getAge();
int num2 = num1 == 0?s1.getName().compareTo(s2.getName()):num1;
return num2;
}
});
附上共性代码:
//创建学生集合
Student s1 = new Student("赵云",19);
Student s2 = new Student("刘备",21);
Student s3 = new Student("关羽",22);
Student s4 = new Student("张飞",19);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
for(Student s : ts)
{
System.out.println(s.getName()+","+s.getAge());
}