TreeSet和TreeMap
本章节仅展示TreeSet
展示在内部比较器下显示的结果
1.1 创建Student类并实现内部比较器
import java.util.Objects;
/**
* 创建一个Student的javaBean对象 实现内部比较器
*/
public class Student implements Comparable<Student>{
private int sno; //学号
private String name; //姓名
private int age; //年龄
private int score; //成绩
public Student() {
}
public Student(int sno, String name, int age, int score) {
this.sno = sno;
this.name = name;
this.age = age;
this.score = score;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
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;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
//实现Conparable内部比较器,并且定义规则
@Override
public int compareTo(Student o) {
//按照学号 从小到大排序
return this.sno-o.sno;
}
}
1.2 创建TreeSet对象实现比较器
import java.util.*;
/**
* 使用Set测试添加Student学生类信息
*/
public class TestHeshSet2 {
public static void main(String[] args) {
//唯一 有序 自然顺序 底层使用了红黑二叉树
//为什么 TreeSet需要实现内部比较器和外部比较器 红黑二叉树需要进行排序,查询或者删除
Set<Student> set=new TreeSet<Student>();
//创建学生对象,并使用集合添加学生信息
Student student=new Student(1001,"zhangsan",21,99);
Student student1=new Student(1002,"lisi",25,100);
Student student2=new Student(1003,"wangwu",17,69);
Student student3=new Student(1001,"zhangsan",21,99);
//向集合中添加数据
set.add(student2);
set.add(student);
set.add(student3);
set.add(student1);
//使用迭代器循环遍历输出
//Student类已经实现了Comparable<>比较器 按照学号从小到大排序
Iterator<Student> iterator=set2.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
当内部比较器和外部比较器都使用的前提下,会优先执行哪一个?
2.1 创建一个外部比较类实现外部比较器
import java.util.Comparator;
public class TestIdComparator implements Comparator<Student1> {
@Override
public int compare(Student1 stu1, Student1 stu2) {
//根据学号进行降序排序 从大到小排序
return stu2.getSno()-stu1.getSno();
}
}
2.2 创建Student类实现内部比较器
/**
* 创建一个Student的javaBean对象
*/
public class Student1 implements Comparable<Student1>{
private int sno; //学号
private String name; //姓名
private int age; //年龄
private int score; //成绩
public Student1(int sno, String name, int age, int score) {
this.sno = sno;
this.name = name;
this.age = age;
this.score = score;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
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;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
@Override
public int compareTo(Student1 o) {
//按照学号
return this.sno-o.sno;
}
}
2.3 创建TreeSet实现类,指定外部比较器
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* 使用Set测试添加学生类信息,通过Comparable()和Comparator()进行比较
*/
public class TestHeshSet3 {
public static void main(String[] args) {
//创建学生对象,并使用集合添加学生信息
Student1 student=new Student1(1001,"zhangsan",21,99);
Student1 student1=new Student1(1002,"lisi",25,100);
Student1 student2=new Student1(1003,"wangwu",17,69);
Student1 student3=new Student1(1001,"zhangsan",21,99);
// TestIdComparator()内部实现的是通过学号进行倒序排序
Comparator<Student1> comparator=new TestIdComparator();
//唯一 有序 自然顺序 底层使用了红黑二叉树
//为什么 TreeSet需要实现内部比较器 和 外部比较器 因为红黑二叉树需要进行排序,添加,删除
Set<Student1> set3=new TreeSet<Student1>(comparator);
//向集合中添加数据
set3.add(student2);
set3.add(student);
set3.add(student3);
set3.add(student1);
//使用迭代器循环获取元素
Iterator<Student1> student1Iterator=set3.iterator();
while (student1Iterator.hasNext()){
//输出结果
System.out.println(student1Iterator.next());
}
}
}
总结:
- TreeSet底层结构是红黑二叉树,只需实现了Comparable接口中的compareTo()方法.
- 使用TreeSet进行比较的时候,学生类中不需要重写equals()方法和HashCode()方法.
- 外部比较器通过ID从大到小排序、内部比较器通过ID从小到大排序。当没有指定比较器时,则会执行内部比较器,当指定外部比较器时,则会执行外部比较器。
- TreeMap与Treeset的比较方式一致, 存储方式和输出方法需要改变。