31Arrays数组排序(续)——自定义排序

Posted JustDo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了31Arrays数组排序(续)——自定义排序相关的知识,希望对你有一定的参考价值。

  自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序。

  这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序。

  另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,在调用Arrays的sort()时将排序类对象作为参数传入:public static void sort(T[] a,Comparatorc),根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的(也就是说,对于数组中的任何 e1 和 e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。优点是可以按照多种方式排序,你要按照什么方式排序,就创建一个实现Comparator接口的排序方式类,然后将该排序类的对象传入到Arrays.sort(待排序对象,该排序方式类的对象)

 

方式一:Comparable

   

 1 import java.util.Arrays;
 2 
 3 
 4 public class Hello {
 5     public static void main(String[] args) {
 6         Person p1=new Person("p1",25);
 7         Person p2=new Person("p2",23);
 8         Person p3=new Person("p3",27);
 9         Person p4=new Person("p4",32);
10         Person p5=new Person("p5",18);
11         
12         Person[] arr=new Person[]{p1,p2,p3,p4,p5};
13         System.out.println(Arrays.toString(arr));
14         Arrays.sort(arr);
15         System.out.println(Arrays.toString(arr));
16     }
17 }
18 class Person implements Comparable<Person>{
19     private String name;
20     private int age;
21     public Person(String name, int age) {
22         this.name = name;
23         this.age = age;
24     }
25     @Override
26     public int compareTo(Person o) {
27         return age-o.age;
28     }
29     @Override
30     public String toString() {
31         return "Person [name=" + name + ", age=" + age + "]";
32     }
33 }

输出结果:

[Person [name=p1, age=25], Person [name=p2, age=23], Person [name=p3, age=27], Person [name=p4, age=32], Person [name=p5, age=18]]
[Person [name=p5, age=18], Person [name=p2, age=23], Person [name=p1, age=25], Person [name=p3, age=27], Person [name=p4, age=32]]

 

方式二:Comparator

 1 import java.util.Arrays;
 2 import java.util.Comparator;
 3 
 4 
 5 public class Hello {
 6     public static void main(String[] args) {
 7         Student s1=new Student("s1", 23, 89);
 8         Student s2=new Student("s2", 33, 68);
 9         Student s3=new Student("s3", 31, 75);
10         Student s4=new Student("s4", 17, 80);
11         Student[] arr=new Student[]{s1,s2,s3,s4};
12         
13         System.out.println("未排序:"+Arrays.toString(arr));
14         Arrays.sort(arr, new SortByAge());
15         System.out.println("按年龄排序:"+Arrays.toString(arr));
16         Arrays.sort(arr, new SortByScore());
17         System.out.println("按分数排序:"+Arrays.toString(arr));
18     }
19 }
20 class Student {
21     private String name;
22     private int age;
23     private double score;
24     public String getName() {
25         return name;
26     }
27     public void setName(String name) {
28         this.name = name;
29     }
30     public int getAge() {
31         return age;
32     }
33     public void setAge(int age) {
34         this.age = age;
35     }
36     public double getScore() {
37         return score;
38     }
39     public void setScore(double score) {
40         this.score = score;
41     }
42     public Student(String name, int age, double score) {
43         super();
44         this.name = name;
45         this.age = age;
46         this.score = score;
47     }
48     @Override
49     public String toString() {
50         return "[name=" + name + ", age=" + age + ", score=" + score
51                 + "]";
52     }
53     
54 }
55 
56 class SortByAge implements Comparator<Student>{
57 
58     @Override
59     public int compare(Student o1, Student o2) {
60         return o1.getAge()-o2.getAge();
61     }
62 }
63 
64 class SortByScore implements Comparator<Student>{
65 
66     @Override
67     public int compare(Student o1, Student o2) {
68         // TODO Auto-generated method stub
69         return  o1.getScore()-o2.getScore()>0?1:-1;
70     }
71 }

输出结果:

未排序:[[name=s1, age=23, score=89.0], [name=s2, age=33, score=68.0], [name=s3, age=31, score=75.0], [name=s4, age=17, score=80.0]]
按年龄排序:[[name=s4, age=17, score=80.0], [name=s1, age=23, score=89.0], [name=s3, age=31, score=75.0], [name=s2, age=33, score=68.0]]
按分数排序:[[name=s2, age=33, score=68.0], [name=s3, age=31, score=75.0], [name=s4, age=17, score=80.0], [name=s1, age=23, score=89.0]]

 

对于临时使用的可以使用匿名类的方式:(按年龄降序排序)

Arrays.sort(arr,new Comparator<Student>(){
    @Override
    public int compare(Student o1, Student o2) {
        // TODO Auto-generated method stub
        return o2.getAge()-o1.getAge();
    }    
});    

 

以上是关于31Arrays数组排序(续)——自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

集合-Java中Arrays.sort()自定义数组的升序和降序排序

Arrays.sort()自定义排序的实现

数组转换为集合进行排序,集合数组自定义排序

sort方法和自定义比较器的写法

LeetCode3

String数组排序