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

本文主要是介绍JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、描述

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

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

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

优点是可以按照多种方式排序,你要按照什么方式排序,就创建一个实现Comparator接口的排序方式类,然后将该排序类的对象传入到Arrays.sort(待排序对象,该排序方式类的对象)


二、源代码

方式1:使用Comparable接口

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()方法,使其按照从小到大顺序排序@Overridepublic int compareTo(Person o) {return age-o.age;}//重写Student类的toString()方法,在输入对象时按照以下方式输出@Overridepublic String toString() {		return "Person[name:"+name+",age:"+age+"]";}}
运行结果:

comparable


方式2:使用Comparator接口

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()方法,在输入对象时按照以下方式输出@Overridepublic 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()使其按照学号由小到大排序(前者减去后者)@Overridepublic int compare(Student o1, Student o2) {return o1.getNumber()-o2.getNumber();}}
//按照分数由高到低排列,创建SortByScore类,该类实现Comparator,重写该接口的compare()
class SortByScore implements Comparator<Student>{//重写该接口的compare()使其按照分数由高到低排序(后者减去前者)@Overridepublic int compare(Student o1, Student o2) {return o2.getScore()-o1.getScore();}}
运行结果:

comparator


这篇关于JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/911608

相关文章

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表