TreeSet有2种构造fnagfa
自然排序和比较器排序
TreeSet tt=new TreeSet();
无参构造是自然排序
带参构造是比较强排序
TreeSet
唯一性:是根据比较发返回值是否是0来决定的
排序:
1:自然排序(元素具备比较性)
让元素所属的类实现自然排序接口Comparable
2:比较器排序(集合具备比较性)
让集合的构造方法接收一个比较器接口的子类对象Comparator
public class Student {
public String name;
public int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
}
import java.util.Comparator;
/*
因为构造函数那里需要传这个的对象,所以我们必须先实现它的接口
后面我们使用了匿名内部类,这里我们就不用写了
*/
public class MyComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
//this--s1;s--s2
//长度
int num=s1.name.length()-s2.name.length();
//姓名内容
int num2=num==0?s1.name.compareTo(s2.name):num;
//年龄
int num3=num2==0?s1.age-s2.age:num2;
return 0;
}
}
import java.util.Comparator;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
//TreeSet<Student> tt=new TreeSet<Student>();自然排序,我们这里不使用
//TreeSet<Student>tt=new TreeSet<Student>(new MyComparator());
//如果一个方法的参数是接口,那么真正要的是接口的实现类对象
//而匿名内部类就可以实现
//开发中,这种方法是很灵活的,不需要修改学生类,且每次new新对象的使用我们都可以重写方法
//按照我们想要的方式排序,如果是自然排序,如何我们要修改排序的东西,都要修改学生类很麻烦
TreeSet<Student>tt=new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//this--s1;s--s2
//长度
int num = s1.name.length() - s2.name.length();
//姓名内容
int num2 = num == 0 ? s1.name.compareTo(s2.name) : num;
//年龄
int num3 = num2 == 0 ? s1.age - s2.age : num2;
return 0;
}
});
//看看最后这个)的位置,匿名内部类的使用
//不过这个方法是使用也不多
Student s1=new Student("lingqingxia",27);
Student s2=new Student("zhuangguorong",29);
Student s3=new Student("wanglihong",23);
Student s4=new Student("lingqingxia",27);
Student s5=new Student("liushihsi",22);
Student s6=new Student("wuqilong",40);
Student s7=new Student("lingqingxia",40);
tt.add(s1);
tt.add(s2);
tt.add(s3);
tt.add(s4);
tt.add(s5);
tt.add(s6);
tt.add(s7);
for(Student s:tt){
//System.out.println(tt.name);
System.out.println(s.name+"---------"+s.age);
}
}
}
程序运行结果为: