TreeSet ------自然排序与定制排序(比较器)

Posted gshao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TreeSet ------自然排序与定制排序(比较器)相关的知识,希望对你有一定的参考价值。

前言:TreeSet集合是Set集合的一个子实现类,它是基于TreeMap中的NavigableSet接口实现的,TreeSet集合是默认通过自然排序将集合中的元素进行排序

  TreeSet有两种排序方式:

  1)自然排序

  2)比较器排序

 

1. 自然排序:

  在TreeSet中默认要求里面的元素进行自然排序,强制要求里面的所有元素必须按照Comparable中的compareTo方法进行比较。

  如果容器里面的对象不具备compareTo方法此时就会抛出异常报错,所以必须要让容器中的元素实现Comparable接口,这样它才具备compareTo方法。

    1.TreeSet实例在调用add方法时会调用容器对象的compareTo方法对元素进行比较

    2.TreeSet实例中对象必须是实现了Comparable接口

 

例如:比较Student学生类,应该从哪些方法进行比较?

一般从字段的方面进行比较;比如按照年龄比较;当年龄相等返回0,大于返回1,小于返回-1

姓名是字符串,怎样比较大小,查看api的时候,String已经实现了Comparable接口,String 类里面已经肯定覆写Comparable方法,那是按照String的规则进行比较。

可以直接不管具体内 部是怎样比较,直接调用String类里面比较方法就可以.

 

package TreeSet;

public class Student implements Comparable {
    private int age;  
    private String name;
    public Student(){}
    public Student(int age,String name){
        this.age = age;
        this.name = name;
    }
    
    @Override
    public int compareTo(Object obj) {
//比如按照年龄比较;当年龄相等返回0,大于返回1,小于返回-1
        Student stu = (Student)obj;
        if(this.age > stu.age){
            return 1;
        }else if(this.age<stu.age){
            return -1;
        }else{
            return this.name.compareTo(stu.name);
        }
    }  
    
    @Override  
    public String toString() {  
        return "<" + age + ", " + name + ">";  
    }  

}

 

public class TestStudent {
    public static void main(String[] args) {
        
        TreeSet set = new TreeSet();
        set.add(new Student(20, "zs"));
        set.add(new Student(21, "zs"));
        set.add(new Student(22, "ww"));
        set.add(new Student(23, "zl"));
        System.out.println(set);
    }
}
//结果:[<20, zs>, <21, zs>, <22, ww>, <23, zl>]

 

 

以上是关于TreeSet ------自然排序与定制排序(比较器)的主要内容,如果未能解决你的问题,请参考以下文章

集合之TreeSet(含JDK1.8源码分析)

TreeSet

Java 之 TreeSet集合

Treeset.contains() 问题

Java中TreeMap和TreeSet的底层实现

TreeSet