Set集合概述和特点
可以去除重复
存取顺序不一致
没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素
Set接口
Set集合类在JAVA中以接口的形式存在因此需要通过多态的方法实现Set接口。一般用HashSet和TreeSet实现Set里面的方法。
TreeSet
TreeSet的特点
不包含重复元素的集合
没有带索引的方法
可以将元素按照规则进行排序
底层的数据结构是树
TreeSet的实现
如果要通过TreeSet实现Set集合,必须要制定一个排序规则。常用的两种方法:自然排序Comparable和比较器排序Comparator
Comparable:
使用空参构造创建TreeSet集合
自定义的Student类实现Comparable接口
重写里面的compareTo方法
学生类:
public class Student implements Comparable<Student>{
private int age;
String name;
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Student o) {
return this.age-o.age;
}
}
测试类:
public static void main(String[] args) {
Set<Student> set=new TreeSet<>();
Student student=new Student(24,"Zeus");
Student student2=new Student(21,"Zeus");
Student student3=new Student(24,"Hades");
set.add(student);
set.add(student2);
set.add(student3);
for (Student s: set
) {
System.out.println(s);
}
}
}
结果:
注:通过重写Comparable接口里的方法comparaTo,并在代码块中设置条件,才能输出到控制台
方法comparaTo的原理如下
如果返回值为负数,表示当前存入的元素是较小值,存左边
如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
如果返回值为正数,表示当前存入的元素是较大值,存右边
Comparator:
同样使用上述的Student类,但是这里不需要在Student类中实现Comparator接口
public static void main(String[] args) {
TreeSet<Student> students=new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge()-o1.getAge();//这里改了一下它的条件
}
});
Student student=new Student(24,"Zeus");
Student student2=new Student(21,"Zeus");
Student student3=new Student(24,"Hades");
students.add(student);
students.add(student2);
students.add(student3);
for (Student st:students
) {
System.out.println(st);
}
}
结果:
可以看出,comparaTo和Comparator原理都是一致。只需要在两种方法体中写出所要求的输出条件即可。
两种比较方式小结
自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序。
比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。
在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序