TreeSet集合的特点
- 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序 - 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以不包含重复元素的集合
存储整数并遍历
//创建集合对象
TreeSet<Integer> ts = new TreeSet<Integer>();
//注意不能用 int ,因为集合只能存储引用类型;应该用 int 类型的包装类类型Integer
//添加元素,添加顺序是随便的
ts.add(10);
ts.add(30);
ts.add(50);
ts.add(40);
ts.add(20);
ts.add(30);//重复
//遍历集合
for(Integer i:ts){
System.out.println(i);
}
输出:
10
20
30
40
50
输出是按大小顺序的
自然排序Comparable的使用
- 存储学生对象并遍历,创建TreeSet集合使用无参构造方法
- 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
学生类:
public class Student implements Comparable<Student>{//实现Comparable接口
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 int compareTo(Student s){
int num = this.age - s.age;//按年龄从小到大排序
//如果年龄相同,判断姓名是否相同
if(num == 0){
if(!this.name.equals(s.name)){//判断年龄是否相同
return this.name.charAt(0) - s.name.charAt(0);//首字母的大小比较
}
}
return num;
/*
//用三元运算符更简洁
int num = this.age - s.age;//按年龄从小到大排序
//如果num 为0 就比较姓名是否相同,姓名相同就按字母大小排序
int num2 = num == 0? this.name.compareTo(s.name):num;
return num2;
*/
}
}
Demo:
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
//创建集合对象
TreeSet<Student> ts = new TreeSet<Student>();//无参构造
//创建学生对象,写拼音方便看
Student s1 = new Student("xushi",29);
Student s2 = new Student("huangzhaojun",28);
Student s3 = new Student("diaochan",30);
Student s4 = new Student("yangyuhuang",18);
Student s5 = new Student("meinv",18);//年龄相同,姓名不同
Student s6 = new Student("diaochan",15);//姓名相同,年龄不同(实现中也有同名的人嘛)
Student s7 = new Student("diaochan",15);//姓名和姓名相同
//把学生添加到集合
ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);
ts.add(s5);ts.add(s6);ts.add(s7);
//遍历集合
for (Student s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}
}
输出:
diaochan,15
meinv,18
yangyuhuang,18
huangzhaojun,28
xushi,29
diaochan,30
结论
- 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
- 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
比较排序Comparator的使用
- 存储学生对象并遍历,创建TreeSet集合使用带参构造方法
- 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
步骤一:
- 由上一题的学生类我们照用,但是重写的compareTo方法我们要删掉,再来使用。
步骤二:
- 上一题的Demo类我们照用,但我们要修改一下创建对象的过程。
import java.util.Comparator;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
//创建集合对象,带参构造
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s1.getAge() - s2.getAge();//判断年龄是否相同
num = num == 0?s1.getName().compareTo(s2.getName()):num;//年龄不相同的时候,比较姓名
return num;
}
});
//创建学生对象,写拼音方便看
Student s1 = new Student("xushi",29);
Student s2 = new Student("huangzhaojun",28);
Student s3 = new Student("diaochan",30);
Student s4 = new Student("yangyuhuang",18);
Student s5 = new Student("meinv",18);//年龄相同,姓名不同
Student s6 = new Student("diaochan",15);//姓名相同,年龄不同(实现中也有同名的人嘛)
Student s7 = new Student("diaochan",15);//姓名和姓名相同
//把学生添加到集合
ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);
ts.add(s5);ts.add(s6);ts.add(s7);
//遍历集合
for (Student s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}
}
输出:
diaochan,15
meinv,18
yangyuhuang,18
huangzhaojun,28
xushi,29
diaochan,30
结论:
- TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
- 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T O1, T o2)方法