1.Set实现类TreeSet(重点)
实现排序的方式
1.自然排序法------存储对象的类实现Comparable接口
2.比较器法 ------带参构造方法传入比较器对象(Comparator)
1.1 验证原理-存储单个属性的对象
class Person implements Comparable<Person>{
String name;
public Person(String name) {
this.name=name;
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
@Override
public int compareTo(Person o) {
//按自己方式比较,认为姓名相同则确定唯一
//compareTo方法与二叉树原理匹配的>0 ==0 <0--->升序排列
//return this.name.compareTo(o.name);
return o.name.compareTo(this.name); //倒叙排列
//return 0; //如果返回0,只返回一个对象
}
}
public class Test1 {
public static void main(String[] args) {
Set<Person> set = new TreeSet<Person>();
set.add(new Person("zs")); //ClassCastException: Person cannot be cast to Comparable
set.add(new Person("ls"));
set.add(new Person("zs"));
set.add(new Person("ww"));
System.out.println(set);
}
}
1.2 验证原理-存储多个属性的对象
TreeSet存储对象为两个属性:
分析:需要判断两个属性都一致则认为是同一个对象
//自然排序法—存储类型实现Comparable接口
class Student implements Comparable<Student>{
String name;
int age;
public Student(String name, int age) {
this.name=name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Student o) {
//排序规则:按年龄比较升序,如果年龄相同,则按姓名的降序
/*if(this.age==o.age) { //年龄相同
return o.name.compareTo(this.name); //姓名降序
}else {
return this.age-o.age; //年龄升序
}*/
//排序规则2:先按姓名的升序排,如果姓名相同,则按年龄的降序
if(this.name.equals(o.name)) {
return o.age-this.age; //年龄的降序
}else {
return this.name.compareTo(o.name);
}
}
}
public class Test2 {
public static void main(String[] args) {
Set<Student> set = new TreeSet<>();
set.add(new Student("zs",20));
set.add(new Student("ls",20));
set.add(new Student("zs",