本期知识点:
再谈TreeSet
保证元素排序的两种方式:
再谈TreeSet
保证元素排序的两种方式:
自然排序
比较器排序
1.自然排序:让元素所属的类实现 Comparable接口
TreeSet<Student> a = new TreeSet<Student>(); 空参的构造就是默认的自然排序
class Student implements Comparable<Student>{ } 元素所属的类必须实现一个自然排序的接口
接口 Comparable<T>:
public interface Comparable<T>此接口强制实行它的每个类的对象进行整体排序。这种排序被称为类的自然排序。类的 compareTo 方法被称为它的自然比较方法。
a.方法:
int compareTo(T o) 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
class Student implements Comparable<Student>{ private String name; private int age; public Student() { super(); } public Student(String name, int age) { 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; } @Override public String toString() { return name+"---"+age; } @Override public int compareTo(Student o) { int a = this.getName().compareTo(o.getName()); return a; } } import java.util.TreeSet; public class Demo01 { public static void main(String[] args) { TreeSet<Student> a = new TreeSet<Student>(); a.add(new Student("Nick",23)); a.add(new Student("Ash",23)); a.add(new Student("Tom",21)); a.add(new Student("Peter",20)); a.add(new Student("Jack",21)); a.add(new Student("Lin",22)); for (Student s :a) { System.out.println(s); } } }
2.比较器排序:让集合构造方法接收 Comparator的实现对象。
public MyC implements Comparator<Student>{ } 自定义一个类(MyC),该类就是Comparator接口的子实现类
接口 Comparator<T>:
public interface Comparator<T>强行对某个对象 collection 进行整体排序的比较函数。a.方法:
int compare(T o1, T o2) 比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。boolean equals(Object obj)指示某个其他对象是否“等于”此 Comparator。
b.在开发中常用匿名内部类的方式,开发效率高。
TreeSet<Student> t = new TreeSet<Student>(new Comparator<Student>(){
@Overridepublic int compare(Student s1, Student s2) {
......
}});
class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { 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; } @Override public String toString() { return name+"---"+age; } } public class MyC implements Comparator<Student> { @Override public int compare(Student o1, Student o2) { //比较名字长度 int a = o1.getName().length()-o2.getName().length(); //再比较名字按字典顺序 int b = a == 0 ? o1.getName().compareTo(o2.getName()):a; //再比较年龄 int c = b == 0 ? o1.getAge()-o2.getAge():b; return c; } } import java.util.TreeSet; public class Demo01 { public static void main(String[] args) { TreeSet<Student> a = new TreeSet<Student>(new MyC()); a.add(new Student("aaabbbe", 27)); a.add(new Student("aaa", 27)); a.add(new Student("aaabbbccd", 38)); a.add(new Student("aaabbbc", 27)); a.add(new Student("aaabbbcccdde", 27)); a.add(new Student("aaabbbccc", 38)); a.add(new Student("aab", 29)); a.add(new Student("aaabbbcccddd", 26)); for (Student s : a) { System.out.println(s); } } }