天天看點

Java集合中使用"比較器"的集合

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());
        }
    }
}

           

總結:

  1. TreeSet底層結構是紅黑二叉樹,隻需實作了Comparable接口中的compareTo()方法.
  2. 使用TreeSet進行比較的時候,學生類中不需要重寫equals()方法和HashCode()方法.
  3. 外部比較器通過ID從大到小排序、内部比較器通過ID從小到大排序。當沒有指定比較器時,則會執行内部比較器,當指定外部比較器時,則會執行外部比較器。
  4. TreeMap與Treeset的比較方式一緻, 存儲方式和輸出方法需要改變。