1.排序的引入
由于TreeSet可以实现对元素按照某种规则进行排序,例如下面的例子
- public class TreeSetDemo {
- public static void main(String[] args) {
-
-
- TreeSet<Integer> ts = new TreeSet<Integer>();
-
-
-
- ts.add(20);
- ts.add(18);
- ts.add(23);
- ts.add(22);
- ts.add(17);
- ts.add(24);
- ts.add(19);
- ts.add(18);
- ts.add(24);
-
-
- for (Integer i : ts) {
- System.out.println(i);
- }
- }
- }
运行结果为:
但是对自定义对象呢?
- public class TreeSetDemo02 {
- public static void main(String[] args) {
- TreeSet<Student> ts=new TreeSet<Student>();
-
- Student s1=new Student("zhangsan",20);
- Student s2=new Student("lis",22);
- Student s3=new Student("wangwu",24);
- Student s4=new Student("chenliu",26);
- Student s5=new Student("zhangsan",22);
- Student s6=new Student("qianqi",24);
-
-
- 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());
- }
- }
- }
Student类:
- public class Student {
- private String name;
- private int age;
-
- public Student() {
- super();
-
- }
-
- 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;
- }
- }
运行结果:
原因分析:
由于不知道该安照那一中排序方式排序,所以会报错。
解决方法:
1.自然排序
2.比较器排序
2.自然排序
自然排序要进行一下操作:
1.Student类中实现 Comparable<T>接口
2.重写Comparable接口中的Compareto方法
故Student类为:
特别注意在重写Compareto方法时,注意排序
- package xfcy_04;
-
-
-
-
-
- public class Student implements Comparable<Student> {
- private String name;
- private int age;
-
- public Student() {
- super();
-
- }
-
- 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;
- }
-
- @Override
- public int compareTo(Student s) {
-
-
-
-
- int num=this.name.length()-s.name.length();
-
-
-
- int num1=num==0?this.name.compareTo(s.name):num;
-
- int num2=num1==0?this.age-s.age:num1;
- return num2;
- }
-
- }
而主类中为:
- package xfcy_04;
-
- import java.util.TreeSet;
-
-
-
-
-
-
- public class TreeSetDemo02 {
- public static void main(String[] args) {
-
- TreeSet<Student> ts=new TreeSet<Student>();
-
-
-
- Student s1=new Student("zhangsan",20);
- Student s2=new Student("lis",22);
- Student s3=new Student("wangwu",24);
- Student s4=new Student("chenliu",26);
- Student s5=new Student("zhangsan",22);
- Student s6=new Student("qianqi",24);
-
-
- 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());
- }
- }
- }
运行结果:
3、比较器排序
比较器排序步骤:
1.单独创建一个比较类,这里以MyComparator为例,并且要让其继承Comparator<T>接口
2.重写Comparator接口中的Compare方法
3.在主类中使用下面的 构造方法
主类:
- package xfcy_04;
-
- import java.util.TreeSet;
-
-
-
-
-
-
- public class TreeSetDemo02 {
- public static void main(String[] args) {
-
-
- TreeSet<Student> ts=new TreeSet<Student>(new MyComparator());
-
-
- Student s1=new Student("zhangsan",20);
- Student s2=new Student("lis",22);
- Student s3=new Student("wangwu",24);
- Student s4=new Student("chenliu",26);
- Student s5=new Student("zhangsan",22);
- Student s6=new Student("qianqi",24);
-
-
- 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());
- }
- }
- }
MyComparator类:
- package xfcy_04;
-
- import java.util.Comparator;
-
- public class MyComparator implements Comparator<Student>{
-
- @Override
- public 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;
- }
-
-
-
-
- }
学生类(不需要继承Comparetable接口)
- package xfcy_04;
-
-
-
-
-
- public class Student{
- private String name;
- private int age;
-
- public Student() {
- super();
-
- }
-
- 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;
- }
-
- }
运行结果:
4.比较器修改
由于单独创建一个类不是特别好,因而可以将MyComparetor的内容直接写到主类中
- public class TreeSetDemo {
- public static void main(String[] args) {
-
-
- TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
- @Override
- public 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());
- }
- }
- }
运行结果也如同上面一样
5.总结
A:自然排序:要在自定义类中实现Comparerable<T>接口 ,并且重写compareTo方法
B:比较器排序:在自定义类中实现Comparetor<t>接口,重写compare方法