TreeSet的使用
TreeSet存储结构:红黑树
TreeSet是SortedSet接口的实现类,TreeSet存储的对象类型必须实现comparable接口,从而确定排序规则,实现接口时可以使用泛型指定接口类型,comparable接口的compareTo()方法可以确定添加的对象元素是否重复,如果compareTo()方法返回0,则认为是重复元素,添加元素失败
其中添加元素是无序的,但是会根据一定规则排序,比如根据添加的元素的首字母排序,数字大小排序
如果TreeSet存储的对象类型没有实现Comparable接口将会抛出
java.lang.ClassCastException :com.collection.demo12.Student cannot be cast to java.lang.Comparable
异常,因为红黑树的比较规则无法确定,必须通过实现接口告诉TreeSet如何去比较
Student类(实现comparable接口并且重写compareTo()方法)
public class Student implements Comparable<Student>{
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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//先按姓名比,再按年龄比
@Override
public int compareTo(Student o) {
int n1 = this.getName().compareTo(o.getName());
//n1=0说明name是一样的,这里的compareTO()方法是字符串的,因为获得的名字是字符串
int n2 = this.age-o.getAge();
return n1==0?n2:n1;
}
}
TreeSet类的使用
/**
* 使用TreeSet保存数据
* 存储结构:红黑树
* 要求:元素必须实现Comparable接口,才能确定比较规则,再通过接口的compareTO()方法,如果返回值为0,认为是重复元素
*/
public class Test {
public static void main(String[] args) {
//创建集合
TreeSet<Student> students = new TreeSet<>();
//1添加元素
Student s1 = new Student("xyxy", 25);
Student s2 = new Student("hello", 28);
Student s3= new Student("abc", 55);
Student s4 = new Student("jk", 65);
students.add(s1);
students.add(s2);
students.add(s3);
students.add(s4);
System.out.println(students.size());
//如果Student类没有实现Comparable接口,将会抛出java.lang.ClassCastException异常,因为红黑树的比较规则无法确定
System.out.println(students.toString());
//[Student{name='abc', age=55}, Student{name='hello', age=28}, Student{name='jk', age=65}, Student{name='xyxy', age=25}]
//排序规则:字母排序,数字排序,如果添加的对象姓名相同,年龄不同,就按照年龄大小来排序
//2删除元素
students.remove(s1);
students.remove(new Student("hello", 28));
//以上删除方法可行,因为Student类重写了compareTo()方法,可以确认元素是否重复
System.out.println(students.size());
System.out.println(students.toString());
//3遍历
//3.1增强for循环
System.out.println("=============增强for循环=================");
for(Student s:students){
System.out.println(s);
}
//3.2迭代器
System.out.println("===============迭代器=================");
Iterator<Student> iterator = students.iterator();
while (iterator.hasNext()){
Student next = iterator.next();
System.out.println(next);
}
}
}