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的比較方式一緻, 存儲方式和輸出方法需要改變。