TreeSet:能够对元素按某种规则排序,特点:排序和唯一
排序有2种规则
1:自然排序
2:比较强排序
17.(18和19)p跳了,讲的是源码和数据结构;
一个类的元素要想能够自然排序,就要实现自然排序接口;
这个方法的重写难点在于
我们按照它的主要条件写出来,次要条件也要考虑到
public class Student implements Comparable<Student>{
public String name;
public int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
//实现接口的方法的重写 (Student o)要改成(Student s),不然无法识别Student的对象s
@Override
public int compareTo(Student s) {
//底层的数据结果是二叉树(红黑树)
/*
return 0;
的结果为:
lingqingxia---------27
*/
/*
return 1;
的结果为:
lingqingxia---------27
zhuangguorong---------29
wanglihong---------23
lingqingxia---------27
liushihsi---------22
wuqilong---------40
*/
/*
return -1;
的结果为:
wuqilong---------40
liushihsi---------22
lingqingxia---------27
wanglihong---------23
zhuangguorong---------29
lingqingxia---------27
*/
/*这里返回说明,应该根据我的排序需求来做
如果我们要按照年龄的大小来排序
int num=this.age-s.age;
return num;
但是这样也不够好,我们只考虑了年龄不同的,年龄相同的怎么排序没用考虑到,使得输出少了一个27岁的人
liushihsi---------22
wanglihong---------23
lingqingxia---------27
zhuangguorong---------29
wuqilong---------40
*/
//主要条件 姓名的长度
int num=this.name.length()-s.name.length();
//姓名的长度相同,不代表姓名相同,这样写会使我们只能接收长度不同的名字而没用考虑内容不同就封杀了
int num2=num==0?this.name.compareTo(s.name):num;
//姓名的长度和内容相同,不代表年龄相同,所以还要继续判断年龄
int num3=num2==0?this.age-s.age:num2;
return num3;
//具体的各个不同,可以尝试取消掉那一行在体会体会
}
}
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
//对于基本类型
//自然排序
TreeSet<Integer> ts=new TreeSet<Integer>();
ts.add(20);
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
ts.add(18);
ts.add(24);
for(Integer i:ts){
System.out.println(i);
}
System.out.println("--------------------");
/*
对与引用类型,如对象,如果我们没有告诉它怎么排序,且说明情况下算唯一,它就会报错
我们按自然排序(年龄从小到大)和成员变量都相同算同一个元素
*/
//无参构造默认自然排序
TreeSet<Student> tt=new TreeSet<Student>();
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);
//为了最后的那个判断更细致,加上一个s7
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);
}
}
}
程序运行结果为:
17
18
19
20
22
23
24
wuqilong---------40
liushihsi---------22
wanglihong---------23
lingqingxia---------27
lingqingxia---------40
zhuangguorong---------29