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 ------自然排序与定制排序(比较器)的主要内容,如果未能解决你的问题,请参考以下文章