TreeSet中红黑树依赖的2种排序方式

来源:互联网 发布:男生衣服品牌 知乎 编辑:程序博客网 时间:2024/06/06 02:14

方式1:自然排序(元素具备比较性):让元素所属的类实现自然排序接口Comparable<T>。

举例:Integer类实现了Comparable接口,如果你自定义类,该类必须实现Comparable<T>接口,并且重写接口定义的compareTo(T o)方法。

public class Student implements Comparable<Student> {private String name;private int age;public Student() {super();// TODO Auto-generated constructor stub}public Student(String name, int age) {super();this.name = name;this.age = age;}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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "Student[age = "+age+",name = "+name+"]";}//以年龄作为主判断依据//@Override//public int compareTo(Student s) {//// TODO Auto-generated method stub//int num = this.age -  s.age;//int num2 = num == 0?this.name.compareTo(s.name):num;//return num2;//}//以名字的长度作为主判断依据@Overridepublic int compareTo(Student o) {// TODO Auto-generated method stubint num = this.name.length() - o.name.length();int num2 = num == 0?this.name.compareTo(o.name):num;int num3 = num2 == 0?this.age - o.age:num2;return num3;}}

方式2:比较器排序(集合具备比较性):让集合的构造方法接收一个比较器接口Comparator<T>的子类对象。

注意:与方式1比较,方式2更加的常用,因为不用改变Student类,这样就避免了影响其他人使用Student类。

举例:

import java.util.Comparator;import java.util.TreeSet;/* * 需求:请按照姓名的长度排序 *  * TreeSet集合保证元素排序和唯一性的原理 * 唯一性:是根据比较的返回是否是0来决定。 * 排序: * A:自然排序(元素具备比较性) * 让元素所属的类实现自然排序接口 Comparable * B:比较器排序(集合具备比较性) * 让集合的构造方法接收一个比较器接口的子类对象 Comparator */public class TreeSetDemo {public static void main(String[] args) {// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象// 而匿名内部类就可以实现这个东西TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {// 姓名长度int num = s1.getName().length() - s2.getName().length();// 姓名内容int num2 = num == 0 ? s1.getName().compareTo(s2.getName()): num;// 年龄int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;return num3;}});// 创建元素Student s1 = new Student("linqingxia", 27);Student s2 = new Student("zhangguorong", 29);Student s3 = new Student("wanglihong", 23);Student s4 = new Student("linqingxia", 27);Student s5 = new Student("liushishi", 22);Student s6 = new Student("wuqilong", 40);Student s7 = new Student("fengqingy", 22);Student s8 = new Student("linqingxia", 29);// 添加元素ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);ts.add(s5);ts.add(s6);ts.add(s7);ts.add(s8);// 遍历for (Student s : ts) {System.out.println(s.getName() + "---" + s.getAge());}}}



0 0