JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

Java中Comparable接口和Comparator接口怎么用? 阅读详情
JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
2015-04-28       0  个评论    来源:永不言弃!  
收藏     我要投稿

一、描述

自定义的类要按照一定的方式进行排序,比如一个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(待排序对象,该排序方式类的对象)

 

二、源代码

方式1:使用Comparable接口

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package tong.day4_27.systemUse;
 
import java.util.Arrays;
/**
  * 使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法
  * 缺点是只能按照一种规则排序
  * @author tong
  *
  */
public class ObjectSort {
 
     public static void main(String[] args) {
         Person[] persons = new Person[ 5 ];
         persons[ 0 ] = new Person( "tom" , 45 );
         persons[ 1 ] = new Person( "jack" , 12 );
         persons[ 2 ] = new Person( "bill" , 21 );
         persons[ 3 ] = new Person( "kandy" , 34 );
         persons[ 4 ] = new Person();
         Arrays.sort(persons);
         for (Person person:persons) {
             System.out.println(person);
         }
 
     }
 
}
class Person implements Comparable<person>{
     private String name;
     private int age;
     
     public Person(String name, int age){
         this .name = name;
         this .age = age;
     }
     public Person(){
         this ( "unknown" , 0 );
     }
     //重写该类的compareTo()方法,使其按照从小到大顺序排序
     @Override
     public int compareTo(Person o) {
          return age-o.age;
         
     }
     //重写Student类的toString()方法,在输入对象时按照以下方式输出
     @Override
     public String toString() {     
         return "Person[name:" +name+ ",age:" +age+ "]" ;
     }
     
}</person>
运行结果:

 

comparable

 

方式2:使用Comparator接口

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package tong.day4_27.systemUse;
 
import java.util.Arrays;
import java.util.Comparator;
 
/**
  * 使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法
  * public static <t> void sort(T[] a,Comparator<!--? super T--> c),根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的
  * (也就是说,对于数组中的任何 e1 和 e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。
  * 优点是可以按照多种方式排序,你要按照什么方式排序,就创建一个实现Comparator接口的排序方式类,然后将该排序类的对象传入到Arrays.sort(待排序对象,该排序方式类的对象)
  * @author tong
  *
  */
 
public class ComparatorUse {
 
     
     public static void main(String[] args) {
         Student[] persons = new Student[ 5 ];
         persons[ 0 ] = new Student( "tom" , 1 , 88 , 45 );
         persons[ 1 ] = new Student( "jack" , 6 , 80 , 12 );
         persons[ 2 ] = new Student( "bill" , 4 , 68 , 21 );
         persons[ 3 ] = new Student( "kandy" , 2 , 98 , 34 );
         persons[ 4 ] = new Student( "lily" , 5 , 94 , 20 );
         System.out.println( "排序前的数据:" );
         for (Student student:persons) {
             System.out.println(student);
         }
         //创建SortByNumber对象,将其作为参数传入Arrays.sort(persons,sortByNumber)方法中
         SortByNumber sortByNumber = new SortByNumber();
         Arrays.sort(persons,sortByNumber);
         System.out.println( "根据学生编号由低到高排序:" );
         for (Student student:persons) {
             System.out.println(student);
         }
         SortByScore sortByScore = new SortByScore();
         Arrays.sort(persons,sortByScore);
         System.out.println( "根据学生成绩由高到低排序:" );
         for (Student student:persons) {
             System.out.println(student);
         }
 
 
     }
 
}
 
class Student {
     private String name;
     private int number;
     private int score;
     private int age;
     
     public Student(String name, int number, int score, int age){
         this .name = name;
         this .number = number;
         this .score = score;
         this .age = age;
     }
     //重写Student类的toString()方法,在输入对象时按照以下方式输出
     @Override
     public String toString() {     
         return "Student[name:" +name+ ",age:" +age+ ",number:" +number+ ",score:" +score+ "]" ;
     }
 
     public String getName() {
         return name;
     }
 
     public void setName(String name) {
         this .name = name;
     }
 
     public int getNumber() {
         return number;
     }
 
     public void setNumber( int number) {
         this .number = number;
     }
 
     public int getScore() {
         return score;
     }
 
     public void setScore( int score) {
         this .score = score;
     }
 
     public int getAge() {
         return age;
     }
 
     public void setAge( int age) {
         this .age = age;
     }
     
     
     
}
//按照学号由低到高排列,创建SortByNumber类,该类实现Comparator,重写该接口的compare()
class SortByNumber implements Comparator<student>{
     //重写该接口的compare()使其按照学号由小到大排序(前者减去后者)
     @Override
     public int compare(Student o1, Student o2) {
         return o1.getNumber()-o2.getNumber();
         
     }
     
}
//按照分数由高到低排列,创建SortByScore类,该类实现Comparator,重写该接口的compare()
class SortByScore implements Comparator<student>{
     //重写该接口的compare()使其按照分数由高到低排序(后者减去前者)
     @Override
     public int compare(Student o1, Student o2) {
         return o2.getScore()-o1.getScore();
         
     }
     
}</student></student></t>
运行结果:

 

comparator

Java多态和实现接口的类的对象赋值给接口引用的方法(推荐) 下面小编就为大家带来一篇Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

相关推荐

TongWeb微服务部署实战:Nacos注册与网关路由的疑难解析

本文分享了将Spring Cloud微服务迁移至TongWeb应用服务器时,解决Nacos服务注册失败与Spring Cloud Gateway路由失效的实战经验。针对Nacos注册问题,通过实现ApplicationRunner接口并利用JMX获取容器端口,实现了手动注册;针对网关路由问题,建议将基于WebFlux的Gateway模块改为JAR包独立部署,以保障其原生运行环境。文章为在TongWeb上进行微服务部署提供了关键的问题排查思路与混合架构部署的最佳实践。

weixin_29209801的博客 240

怎么理解、重写Java的Arrays.sort()的比较器Comparator的compare()方法,自定义排序规则

重写Java的Arrays.sort()的比较器,在重写compare(a,b)方法时,其实就是要选择返回a-b还是b-a,可以这样理解着改写: 假设数组的前两个元素从左到右分别为a和b,且a>b(即数组初始顺序为降序), 若你想调用sort后,顺序改为升序,则让其输出正数,返回a-b;若你想用sort后,顺序不变仍保持为降序,则让输出负数,返回b-a。............

GsxxInCsdn的博客 1万+

基于 WebGoat 平台的 SQL 注入攻击

基于 WebGoat 平台的 SQL 注入攻击

Labulongdong的博客 3524

Arrays.sort()如何实现从大到小排序

Java中的Arrays.sort()方法默认将数组元素从大到小排序. 要实现从大到小排序java也提供了一种方法: Arrays中的sort(T[] a, Comparator c),  但是传入的数组类型不能是基本类型(int char double),只能使用对应的类(Integer),因为Comparator接口中的 compare()方法默认从小到大排序,我们只需要重写这个方法就行

IMISSHOT的博客 2万+

PyCharm与MicroPython联手:打造高效ESP32开发环境

本文详细介绍了如何使用PyCharm与MicroPython打造高效的ESP32开发环境。通过配置PyCharm插件、刷写MicroPython固件以及实战示例,帮助开发者快速上手嵌入式Python开发,显著提升物联网项目的开发效率。

weixin_29169899的博客 380

差分隐私(Differential Privacy)

差分隐私,拉普拉斯机制和高斯机制的证明

Michale_L的博客 1万+

使用Arrays类对数组中的对象元素进行排序(升序)

Student10 st11 = new Student10(“张三丰”, 99, 1.80);Student10 st12 = new Student10(“李淳风”, 99, 1.78);Student10 st10 = new Student10(“张三”, 23, 1.73);

weixin_43283808的博客 189

后摄模块辐射超标整改

某行车记录仪在EMI测试中出现辐射超标问题,通过模块剥离法定位到后摄模块的Ethernet数据线为噪声源。深入检查发现TYPE-C延长线屏蔽层未有效接地,形成辐射泄漏通道。整改措施包括加强屏蔽层360°接地、使用导电布改善连接处屏蔽等,最终使辐射降至EN55032 Class B限值以内。案例揭示了高速信号延长线中屏蔽连续性的重要性,建议设计阶段就重视连接器屏蔽设计和共模干扰抑制。

硬核科技 256

Arrays.sort()使用Comparator或 Comparable接口对对象排序

简述:如果要排序的数组中元素为基本数据类型,那么Arrays.sort()就会自己判断元素大小并排序,如果数组中的数据类型为引用类型那么就要自己定义排序方法。 方法一、使用Comparable接口: 让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo() 。方法缺点是只能按照一种规则排序。 方法二、使用Comparator接口 (推荐使用) 使用编写排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法。优

sduihoal的博客 1615

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 179

[AHK]获取通达信软件上的股票代码

PC上的股票交易软件的自动止损、自动下单等功能比较弱,不如期货交易软件。 自力更生,程序员都是自己打造工具。 根据IPO模型(Input 输入,Process处理,Output输出),为了方便自动化首先要获取当前交易软件上浏览的股票代码。 截图再OCR显然太麻烦,通过Winspy工具查看下交易软件自带功能的消息号(33780),大家记住这个号码! 下面在用AutoHotkey作为变成语...

liuyukuan的专栏 1万+

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序(转载)

参考于:https://blog.csdn.net/tongyuehong137/article/details/45318567?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-

qq_39653453的博客 729

PCL 利用RANSAC改进的ICP算法

本文介绍了一种基于RANSAC改进的ICP点云配准算法。算法原理部分阐述了在ICP迭代过程中使用RANSAC剔除错误匹配点对的方法。

点云侠的博客 196

java arrays.sort comparator_JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序 -- 转...

一、描述自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序。这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序。另一种方式是使用Comparator接口:编写多个排序方...

weixin_42178688的博客 770

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序 -- 转...

一、描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序。 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序。 另一种方式是使用Comparator接口:...

yjc0403的博客 454

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )

Java Sort方法的使用

2302_79862386的博客 4431

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Java 学习】Comparable接口 和 Comparator接口,掌控排序逻辑解析,深入 Comparable 和 Comparator 的优雅切换

在 Java 编程中,排序是处理数据时常见的需求,而 Comparable 和 Comparator 是实现对象排序的重要工具。本文逐步讲解了 Comparable 和 Comparator 接口的原理、用法及应用场景,通过对比它们的特性,揭示了两者的核心区别。Comparable 适合定义对象的自然排序规则,排序逻辑直接内嵌于类中;而 Comparator 则更为灵活,支持在外部定义多种排序规则。无论是实现单一排序还是多种自定义排序,本文都提供了清晰的代码实例和详细的分析,为开发者提供了全面指导。

Code哈哈笑的博客 7480

Java中Collections.sort()排序详解

java中Collections.sort排序详解java基础—— Collections.sort的两种用法,简单明了 。java List 排序 Collections.sort()Java 中 Comparable 和 Comparator 比较第一种:ComparableComparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Compa

薛瑄的博客 7万+

java刷题必备排序,Arrays.sort()和Collections.sort()

Arrays.sort()对数组进行排序,Collections.sort()对list集合进行排序。 对于基本数据类型,使用Array.sort() ,默认是升序。 对于基本数据类型的包装类,使用Collections.sort(),默认是升序。 对于元素为实体类(对象),Array.sort()和Collections.sort()都可以自定义排序,只不过一个对数组进行排序,一个对list集合进行排序,但是数组及list集合中元素必须实现comparable接口。 1、基于Arrays.so

King_wq_2020的博客 6206

JAVA中Arrays.sort()使用方法,升序降序,以及自定义比较器(Comparable和Comparator接口)的使用,小白向

1.Array.sort()的使用方法 关于Array.sort()有三种格式,如下: 1.sort(Objetc[] a)来进行对象的自然排序,该对象必需实现Compareable接口,重写compareableTo方法,并一般在此方法中定义这3种返回值(1,0,-1)来进行排序标准的确认,后续关于返回值的正负会进行说明。而让对象继成Compareable接口的方式,称为内部比较器。 2.sort(T[] a, Comparator>? super T<> c)当调用此方法来进行自定义

Aomiz_lm的博客 4793

【Java】深入理解Comparable和Comparator对象排序

对于不清楚如何排序的对象,需要该对象的类使用Comparable接口来指定排序的方法(如果该类不实现Comparable接口,也可以指定一个Comparator进行排序,这点一会说)。String类的Comparable接口使用了泛型,通过查看Comparable接口的源码可以看到,这里的泛型规定了Object类的具体子类,一般传入实现该接口的类即可,比如Student类,泛型传入Student。TimSort是对归并排序做了大量优化的新版本,所以程序会跳转到TimSort.sort方法中,完成对象排序。

gaowencheng01的博客 6314
上一篇: sql里 a.user_id=b.o_iccard(+) 这个 "(+) " 什么意思?
下一篇: jd-gui反编译 access$xxx类函数说明
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值