一、例题
我们要求使用带参构造方法,也就是指定比较器的方式
在TreeSet里面传了一个Comparator接口,就是根据指定的比较器进行排序
这里要求传入一个接口,实际上就是传入的接口的实现类对象,因为接口是不能直接实例化的,需要实现类来实例化
我们写一个类实现Comparator接口
代码演示:
Student类:
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;
}
@Override
public String toString() {
return getName()+","+getAge();
}
}
测试类:
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class ComparatorDemo {
public static void main(String[] args) {
//这里采用匿名内部类的方式创建的Comparator的实现类
TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
@Override
//因为是
public int compare(Student student1, Student student2) {
//为什么要传两个对象而不用this代表其中一个
//因为这个方法是匿名内部类中的方法,其实算在ComparatorDemo这个类中,this指的是ComparatorDemo这个类.
int num = student1.getAge() - student2.getAge();
int num2 = num == 0 ? student1.getName().compareTo(student2.getName()) : num;
return num2;
}
});
Student student1=new Student("a",15);
Student student2=new Student("c",18);
Student student3=new Student("d",15);
treeSet.add(student1);
treeSet.add(student2);
treeSet.add(student3);
Iterator iterator=treeSet.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
输出:
a,15
d,15
c,18
二、总结
三、练习
代码演示:
Student类:
public class Student {
private String name;
private int Chinese;
private int Math;
public Student() {
}
public Student(String name, int chinese, int math) {
this.name = name;
Chinese = chinese;
Math = math;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getChinese() {
return Chinese;
}
public void setChinese(int chinese) {
Chinese = chinese;
}
public int getMath() {
return Math;
}
public void setMath(int math) {
Math = math;
}
public int getSum(){
return this.Math+this.Chinese;
}
}
测试类:
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Student> treeSet=new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student student, Student t1) {
//主要条件
int num1= student.getSum()-t1.getSum();
//次要条件,如果不写这个,当我们比较完总成绩,如果相同,那么就认为两个元素相同,实际上还可以名字或语文成绩或者数学成绩不同
int num2=num1==0? student.getChinese()-t1.getChinese():num1;
//次要条件,如果不写这个,当我们比较完总成绩和语文或者数学成绩,如果相同,那么就认为两个元素相同,实际上还可以名字不同
int num3=num2==0? student.getName().compareTo(t1.getName()):num2;
return num3;
}
});
Student student1=new Student("s",10,11);
Student student2=new Student("ss",5,2);
Student student3=new Student("sss",14,15);
Student student4=new Student("ssss",14,15);
treeSet.add(student1);
treeSet.add(student2);
treeSet.add(student3);
treeSet.add(student4);
for (Student student:treeSet){
System.out.println("姓名:"+student.getName()+","+"数学成绩:"+student.getMath()+","+"语文成绩:"+student.getChinese()
+","+"总成绩:"+student.getSum());
}
System.out.println();
}
}
次要条件需要我们分析得出
输出:
姓名:ss,数学成绩:2,语文成绩:5,总成绩:7
姓名:s,数学成绩:11,语文成绩:10,总成绩:21
姓名:sss,数学成绩:15,语文成绩:14,总成绩:29
姓名:ssss,数学成绩:15,语文成绩:14,总成绩:29