31、Arrays数组排序(续)——自定义排序
自定义的类要按照一定的方式进行排序,比如一个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数组排序(续)——自定义排序相关推荐
- vector排序|vector多维数组排序|vector自定义排序|不改变相同元素相对顺序比较
vector<int>排序 头文件:#include <algorithm> 示例如下,默认升序 #include <iostream> #include < ...
- php的数组排列函数,PHP实现的自定义数组排序函数与排序类示例
本文实例讲述了PHP实现的自定义数组排序函数与排序类.分享给大家供大家参考,具体如下: /* * 二维数组自定义排序函数 * uasort($arr,function_name) * **/ $arr ...
- Java中Arrays.sort()的三种常用用法(自定义排序规则)
Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序. 举例如下: import java.util.Arrays;public class Mai ...
- ruby 数组自定义排序_在Ruby中对数组排序
ruby 数组自定义排序 Sorting was a preoccupation for computer scientists from early on. There were many algo ...
- 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序
1.实现对象数组排序 (1)方法一,需要排序的对象所属的类实现Comparable接口,复写 comparaTo方法 (2)方法二,需要排序的对象所属的类已经完成无法实现Comparable接口,这 ...
- Java 自定义排序
文章目录 数组排序 包装类排序 Java 自定义排序 1.实现 Comparable 接口并重写 compareTo() 方法 2.实现 Comparator 接口,重写 compare() 方法. ...
- 【韩老师零基础30天学会Java 09】Math Arrays 数组拷贝 自然排序 System BigDecimal 银行家算法舍入 日期类LocalDateTime转换 String翻转
Math abs绝对值 pow求幂 ceil向上取整 floor向下取整 round四舍五入 sqrt求开方 random求随机数 思考: 请写出获取a-b之间的一个随机整数,a,b均为整数?2-7 ...
- php usort strc,php中usort自定义排序如何使用
php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort - 使 ...
- Arrays.sort 不区分大小写 排序
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 一.Comparator 强行对某个对象collection进 ...
- 对二维数组自定义排序、Treemap自定义排序、priorityqueue自定义排序
二维数组自定义排序 Arrays.sort(intervals,new Comparator<int[]>() {@Override public int compare(int[]a,i ...
最新文章
- Oracle调用webservice说明
- 翻译器DIY它———算在英文文本中的单词数,字符和行数
- matlab做计算器纯代码,**matlab GUI-纯编程实现简单计算器**
- c#中关于协变性和逆变性(又叫抗变)帮助理解
- 软考网络工程师学习笔记1-计算机网络概念
- 变速恒频风电机组的优缺点_保障风电齿轮箱的有效润滑
- IPV6 Socket编程
- 数据库 超市零售管理系统
- 微服务架构之监控预警
- Python图像处理库PIL中图像格式转换(二)
- 大恒相机-水星(MERCURY)系列 | 软件启动
- Android LBS
- sequelize模型关联_Node.js Sequelize 模型(表)之间的关联及关系模型的操作
- [Jzoj] 2197. 三核苷酸
- java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity异常的易被忽略的原因
- python中rgb颜色_Python 转换RGB颜色值的示例代码
- NN入门,手把手教你用Numpy手撕NN(一)
- 第一周--Centos7中的 at 使用技巧及其历史命令管理和用法
- 用C#实现控制台进度条
- seo视频教程,seo视频教程,seo新手教学
热门文章
- Docker报错:Temporary failure in name resolutionProxy Authentication Required
- linux 防火墙 80端口,Linux配置防火墙,开启80端口、3306端口
- centos7查看当前系统时间、_CentOS 7修改系统时间及硬件时间
- 现代通信原理A.1-a:仿真确定信号波形与频谱(Matlab版)
- 代码整洁之道读书笔记----第三章---函数--第一节-专注且短小
- 最大熵模的理解与最大熵模型逻辑回归相似转换条件
- 多线程打印ABCD顺序(带有线程池实现)
- mysql 伪哈希_MySQL技巧--伪哈希索引
- Keras入门——(1)全连接神经网络FCN
- CSS之cursor用法