天天看点

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的比较方式一致, 存储方式和输出方法需要改变。