【JavaSE笔记】集合(四)

xiaoxiao2021-02-28  121

本期知识点: 再谈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>(){ @Override public 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); } } }
转载请注明原文地址: https://www.6miu.com/read-39937.html

最新回复(0)