目录
一:TreeSet类概述
二:TreeSet是如何保证元素的排序和唯一性的
三:排序的方式有两种
四:例子
1:TreeSet集合存储自定义对象并遍历自然排序(按照年龄大小排序)
?2:TreeSet集合存储自定义对象并遍历比较器排序(按照年龄大小排序)
一:TreeSet类概述
使用元素的自然顺序对元素进行排序。
或者根据创建 set 时提供的 Comparator 进行排序。
具体取决于使用的构造方法。
元素唯一,且元素的顺序可以按照某种规则进行排序。
二:TreeSet是如何保证元素的排序和唯一性的
底层数据结构是红黑树(红黑树是一种自平衡的二叉树)。
利用TreeMap里的put方法然后comparabler接口进行排序初始化是null如果进来的数据不是空就进入根然后再进来元素时进行比较大于就在右结点小于就在左结点等于就不操作。后面要传的值要实现comparabler接口否则不能实现。
遍历对象时对象要实现comparabler。
保证唯一的原理:是根据比较的结果是否是0来决定的。
三:排序的方式有两种
自然排序(传入的数据类型具备实现了Comparable接口)。
比较器排序 TreeSet(Comparator?comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。
TreeSet的俩个特点:排序和唯一。
TreeSet集合保证元素的排序和唯一。
四:例子
1:TreeSet集合存储自定义对象并遍历自然排序(按照年龄大小排序)
package day27;
import java.util.Objects;
public class Student implements Comparable<Student>{//创建学生类实现 Comparable接口
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public Student() {
}
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 String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
//重写compareTo,比较年龄大小,年龄一样再比较姓名
@Override
public int compareTo(Student o) {
int i=o.age-this.age;
int i1= i==0? this.name.compareTo(o.name):i;
return i1;
}
}
package day27;
import java.util.TreeSet;
public class Test18 {
public static void main(String[] args) {
TreeSet<Student> students = new TreeSet<>();//创建TreeSet对象指定数据类型为Student
//添加元素
Student s1 = new Student(18, "小花");
Student s2 = new Student(17, "小明");
Student s3 = new Student(19, "小可");
Student s4 = new Student(20, "小良");
Student s5 = new Student(22, "小亮");
Student s6= new Student(19, "小花");
Student s7 = new Student(17, "小明");
//把学生对象添加到元素中
students.add(s1);
students.add(s2);
students.add(s3);
students.add(s4);
students.add(s5);
students.add(s6);
students.add(s7);
//增强for循环
for (Student student : students) {
System.out.println(student.getName()+"**"+student.getAge());
}
}
}
?
?2:TreeSet集合存储自定义对象并遍历比较器排序(按照年龄大小排序)
package day27;
import java.util.Objects;
public class Student{
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public Student() {
}
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 String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
}
package day27;
import java.util.Comparator;
import java.util.TreeSet;
public class Test19 {
public static void main(String[] args) {
TreeSet<Student> students = new TreeSet<>(new Comparator<Student>() {
//用匿名内部类形式实现Comparator重写compare方法
@Override
public int compare(Student o1, Student o2) {
//判断年龄是否一样,一样再进行判断姓名
int i = o2.getAge()-o1.getAge();
int i1 = i==0? o2.getName().compareTo(o1.getName()):i;
return i1;
}
});
Student s1 = new Student(18, "小花");
Student s2 = new Student(17, "小明");
Student s3 = new Student(19, "小可");
Student s4 = new Student(20, "小良");
Student s5 = new Student(22, "小亮");
Student s6= new Student(19, "小花");
Student s7 = new Student(17, "小明");
//把学生对象添加到元素中
students.add(s1);
students.add(s2);
students.add(s3);
students.add(s4);
students.add(s5);
students.add(s6);
students.add(s7);
for (Student student : students) {
System.out.println(student.getName()+"**"+student.getAge());
}
}
}
?
|