reed-wafw

这两种排序方法是用来对象之间的比较。

1. 自然排序(java.lang.Comparable)

2. 比较器排序

第一种排序实现(自然排序): (实质 : 序过程中比较两个对象“大小”时使用的就是 Comparable 接口的 compareTo 方法)

第一步:  元素自身具备比较性 (比如说年龄)

第二步:  实现Compareable接口,覆盖其CompareTo方法

以学生为例:

 1 package cn.reed_1.itcast;
 2                            // 第一步 : 学生类继承Comparable
 3 public class Student implements Comparable<Student>{
 4     private String name; // 属性定义为 私有的,防止其类访问
 5     private int age;
 6     //无参构造方法   子类继承父类,会自动继承父类的默认构造方法(无参构造),如果子类中有有参构造,父类无无参构造,则程序会报错(系统不知道继承哪一个构造函数)
 7     public Student() {
 8         super();
 9     
10     }
11     //有参构造方法     构造方法 都用来初始化类的数据成员(姓名和年龄)
12     public Student(String name, int age) {
13         super();
14         this.name = name;
15         this.age = age;
16     }
17 
18     public String getName() {
19         return name;
20     }
21 
22     public void setName(String name) {
23         this.name = name;
24     }
25 
26     public int getAge() {
27         return age;
28     }
29 
30     public void setAge(int age) {
31         this.age = age;
32     }  // 第二步 : 重写 compareTo方法 
33     @Override
34     public int compareTo(Student s) {
35         /*// TODO Auto-generated method stub
36         return 0;
37         //主要条件
38         int num  =this.age-s.age;
39         //次要条件
40         //如果年龄和姓名相同。才是同一个元素
41         //如果年龄相同,就比较名字,否则(年龄不相同,)返回的是年龄
42         int num2 = num == 0? this.name.compareTo(s.name) :num ;
43         return num2;*/
44         
45         //主要条件以名字长度排序
46         int num = (this.name).length()  - s.name.length();
47         //次要条件 (如果名字长度相同,在比较名字内容是否相同)
48         int num2 =num ==0? this.name.compareTo(s.name) :num;
49        //在次要条件(如果名字长度相同,内容也相同,开始比较年龄)
50         int num3 = num2==0? this.age-s.age :num2;
51         return num3;
52         //

                         comparable接口提供的compareTo 方法 ,该方法的返回值类型为 int ,如果返回值的值大于0,则代表

                         当前对象比obj对象大,反之,则相反。则这就是两个对象比较的其实 是compareTo方法

53     
54 
55 }
56 }

 第二种方法 : TreeSet 有参构造方法 (优于自然排序)  java.util.Comparator

之所以会有TreeSet的比较器排序,是因为自然排序它仅仅局限于同一个对象的一种方法,当想要采用其他方法进行排序,就必须在原来的方法上修改。

然而运用比较器排序。 可以实现同一对象的不同的排序方法

优点 : Comparator 接口 将比较排序算法 和 具体的实体类分离了

 

TreeSet(Comparator<? super E> comparator) 

当参数是一个接口,那么它需要的是接口的实现类对象而  匿名内部类 刚好能做到这一点。

 

需要做的是 : comparetator 具体实现类,并重写方法

package cn.itcast_01;


import java.util.Comparator;
import java.util.TreeSet;

import cn.reed_1.itcast.Student;

public class TreeDemo {
    public static void main(String[] args) {
        //TreeSet(Comparator<? super E> comparator) 
        //当参数是一个接口,那么它需要的是接口的实现类对象(匿名内部类刚好能做到这一点)
                          
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            
            //重写方法  
            @Override  // 重写 compare方法 
            public int compare(Student s1, Student s2) {
                // 主要条件 长度比较   s.name 不能获取到元素,需要用到getName方法
                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("reed", 20);
        Student s2 = new Student("dora", 22);
        Student s3 = new Student("betty", 25);
        Student s4 = new Student("sunny", 24);
        Student s5 = new Student("reed", 21);
        Student s6 = new Student("reeds", 21);

        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());
        }
    }

}

 

 

 

 

 

分类:

技术点:

相关文章:

  • 2021-09-29
  • 2017-12-06
  • 2022-01-10
  • 2021-11-10
  • 2021-09-22
  • 2021-09-28
  • 2019-01-24
  • 2021-08-16
猜你喜欢
  • 2021-09-03
  • 2021-04-26
  • 2022-01-13
  • 2021-10-03
  • 2021-09-28
  • 2021-09-01
  • 2017-11-23
相关资源
相似解决方案