package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSet 按照自定义对象Student的姓名长度 比较器排序 * * 自然排序or比较器排序取决于,TreeSet的构造方法 * 无参构造:自然排序 * 有参构造: 比较器排序 * * TreeSet集合保证元素排序和唯一性的原理 * 唯一性:根据比较的返回是否是0来决定 * 排序: * A:自然排序(元素具备比较性) * 让元素所属的类实现自然排序接口Comparable * B:比较器排序(集合具备比较性) * 让集合的构造方法接收一个比较器接口的子类对象Comparator * */ public class TreeSetDemo { public static void main(String[] args) { //创建集合对象 // TreeSet<Student> ts=new TreeSet<Student>();//自然排序 // TreeSet<Student> ts= TreeSet(Comparator comparator);//比较器排序 ---推荐使用!因为匿名内部类对其他代码的影响较小 TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>(){ @Override public int compare(Student o1, Student o2) { int num=o1.getName().length()-o2.getName().length(); int num2=num==0?o1.getName().compareTo(o2.getName()):num; int num3=num2==0?o1.getAge()-o2.getAge():num2; return num3; } }); //创建元素对象 Student s1=new Student("linqingxia",27); Student s2=new Student("wuqilong",27); Student s3=new Student("wanglihong",34); Student s4=new Student("zhouxingchi",57); Student s5=new Student("linqingxia",28); Student s6=new Student("linqingxia",27); //添加集合元素 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); ts.add(s6); //遍历集合 for(Student s:ts){ System.out.println(s.getName()+"-----"+s.getAge()); } } }
package cn.itcast.day21.treeset2; public class Student { private String name; private int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public Student() { super(); } 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; } }
自然排序和比较器排序哪个更好呢?
建议: 如果只使用一次,建议采用匿名内部类的方式实现比较器排序。(针对集合的构造)
这样做的好处:当Student类发生变化时,不用修改整体比较逻辑,即不用修改自然排序依赖的compareTo()方法(元素具备的比较性)