Java TreeSet排序的2种方法
1. 自然排序,实现Comparable接口,重写compareTo方法。
让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序或默认排序方式。排序代码如下:
/* 向TreeSet集合中存储自定义对象学生按照学生的年龄进行排序 */ import java.util.*; //此接口强制让Student实现比较性 class Student implements Comparable { //定义Student私有属性 private String name;private int age; //构造Student函数,初始化 Student(String name, int age) {this.name = name; this.age = age; } //公共访问方法,访问私有属性 public String getName() { return name; } public int getAge() { return age; } //复写Comparator中的compare方法,自定义比较器 public int compareTo(Object obj) { //判断是否属于Student类型,否则抛异常 if (! (obj instanceof Student)) throw new RuntimeException("NotSuchTypeException"); //将Object类对象强转为Student类 Student s = (Student) obj; //System.out.println(this.age + "--compare-" + s.age);//测试用,查看比较情况 //按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差 if (this.age == s.age) { return this.name.compareTo(s.name); } else if (this.age < s.age) return this.age - s.age; return this.age - s.age; } /* //如果按照存入顺序输出 public int compareTo() { return 1;//改为-1则按倒叙输出 } */ } //测试 class TreeSetTest { public static void main(String[] args) { //创建集合,并添加元素 TreeSet ts = new TreeSet();ts.add(new Student("li01", 25));ts.add(new Student("li02", 20));ts.add(new Student("li01", 22));ts.add(new Student("li05", 24)); ts.add(new Student("li08", 40)); //打印集合中元素 printE(ts); System.out.println("Hello World!"); } //定义打印集合中元素的功能 public static void printE(TreeSet ts) { //迭代器方法获取 Iterator it = ts.iterator(); while (it.hasNext()) { //将返回的元素(Object类)强转为Student类 Student s = (Student) it.next();System.out.println(s.getName() + "---" + s.getAge()); } } }
2. 比较器,实现Comparator接口,并实现其compare(Object o1,Object o2)方法。
当元素自身不具备比较性是,或者具备比较性,却不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式(即参阅构造函数),其实就是定自己定一个比较器,这个比较器必须实现Comparator接口,并实现其compare(Object o1,Object o2)方法,方法的返回值,是正整数、负整数或零,则两个对象较大、较小或相同,然后将这个比较器作为参数传入TreeSet构造方法中。
注意: 当两种排序方式都存在时,以比较器为主,排序时,当主要条件相同时,按次要条件排序。字符串本身具备比较性,但是它的比较方式可能不是所需要的,这时,就只能使用比较器了。
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。