自定义的类要按照一定的方式进行排序,比如一个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>(){@Overridepublic int compare(Student o1, Student o2) {// TODO Auto-generated method stubreturn o2.getAge()-o1.getAge();}
});    

31、Arrays数组排序(续)——自定义排序相关推荐

  1. vector排序|vector多维数组排序|vector自定义排序|不改变相同元素相对顺序比较

    vector<int>排序 头文件:#include <algorithm> 示例如下,默认升序 #include <iostream> #include < ...

  2. php的数组排列函数,PHP实现的自定义数组排序函数与排序类示例

    本文实例讲述了PHP实现的自定义数组排序函数与排序类.分享给大家供大家参考,具体如下: /* * 二维数组自定义排序函数 * uasort($arr,function_name) * **/ $arr ...

  3. Java中Arrays.sort()的三种常用用法(自定义排序规则)

    Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序. 举例如下: import java.util.Arrays;public class Mai ...

  4. ruby 数组自定义排序_在Ruby中对数组排序

    ruby 数组自定义排序 Sorting was a preoccupation for computer scientists from early on. There were many algo ...

  5. 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序

    1.实现对象数组排序 (1)方法一,需要排序的对象所属的类实现Comparable接口,复写 comparaTo方法  (2)方法二,需要排序的对象所属的类已经完成无法实现Comparable接口,这 ...

  6. Java 自定义排序

    文章目录 数组排序 包装类排序 Java 自定义排序 1.实现 Comparable 接口并重写 compareTo() 方法 2.实现 Comparator 接口,重写 compare() 方法. ...

  7. 【韩老师零基础30天学会Java 09】Math Arrays 数组拷贝 自然排序 System BigDecimal 银行家算法舍入 日期类LocalDateTime转换 String翻转

    Math abs绝对值 pow求幂 ceil向上取整 floor向下取整 round四舍五入 sqrt求开方 random求随机数 思考: 请写出获取a-b之间的一个随机整数,a,b均为整数?2-7 ...

  8. php usort strc,php中usort自定义排序如何使用

    php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort - 使 ...

  9. Arrays.sort 不区分大小写 排序

    当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 一.Comparator 强行对某个对象collection进 ...

  10. 对二维数组自定义排序、Treemap自定义排序、priorityqueue自定义排序

    二维数组自定义排序 Arrays.sort(intervals,new Comparator<int[]>() {@Override public int compare(int[]a,i ...

最新文章

  1. Oracle调用webservice说明
  2. 翻译器DIY它———算在英文文本中的单词数,字符和行数
  3. matlab做计算器纯代码,**matlab GUI-纯编程实现简单计算器**
  4. c#中关于协变性和逆变性(又叫抗变)帮助理解
  5. 软考网络工程师学习笔记1-计算机网络概念
  6. 变速恒频风电机组的优缺点_保障风电齿轮箱的有效润滑
  7. IPV6 Socket编程
  8. 数据库 超市零售管理系统
  9. 微服务架构之监控预警
  10. Python图像处理库PIL中图像格式转换(二)
  11. 大恒相机-水星(MERCURY)系列 | 软件启动
  12. Android LBS
  13. sequelize模型关联_Node.js Sequelize 模型(表)之间的关联及关系模型的操作
  14. [Jzoj] 2197. 三核苷酸
  15. java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity异常的易被忽略的原因
  16. python中rgb颜色_Python 转换RGB颜色值的示例代码
  17. NN入门,手把手教你用Numpy手撕NN(一)
  18. 第一周--Centos7中的 at 使用技巧及其历史命令管理和用法
  19. 用C#实现控制台进度条
  20. seo视频教程,seo视频教程,seo新手教学

热门文章

  1. Docker报错:Temporary failure in name resolutionProxy Authentication Required
  2. linux 防火墙 80端口,Linux配置防火墙,开启80端口、3306端口
  3. centos7查看当前系统时间、_CentOS 7修改系统时间及硬件时间
  4. 现代通信原理A.1-a:仿真确定信号波形与频谱(Matlab版)
  5. 代码整洁之道读书笔记----第三章---函数--第一节-专注且短小
  6. 最大熵模的理解与最大熵模型逻辑回归相似转换条件
  7. 多线程打印ABCD顺序(带有线程池实现)
  8. mysql 伪哈希_MySQL技巧--伪哈希索引
  9. Keras入门——(1)全连接神经网络FCN
  10. CSS之cursor用法