java集合进行排序的两种方式

java集合的工具类Collections中提供了两种排序的方法,分别是:

  • Collections.sort(List list)
  • Collections.sort(List list,Comparator c)

第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下:
实体类:(基本属性,getter/setter方法,有参无参构造方法,toString方法)

package test;public class Emp implements Comparable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Emp() {super();}public Emp(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Emp [name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Object o) {if(o instanceof Emp){Emp emp = (Emp) o;
//          return this.age-emp.getAge();//按照年龄升序排序return this.name.compareTo(emp.getName());//换姓名升序排序}throw new ClassCastException("不能转换为Emp类型的对象...");}}

第二种叫定制排序,或自定义排序,需编写匿名内部类,先new一个Comparator接口的比较器对象c,同时实现compare()其方法;
然后将比较器对象c传给Collections.sort()方法的参数列表中,实现排序功能;

说明:第一种方法不够灵活,实体类实现了comparable接口后,会增加耦合,如果在项目中不同的位置需要根据不同的属性调用排序方法时,需要反复修改比较规则(按name还是按age),二者只能选择其一,会起冲突.第二种就很好地解决了这个问题.在需要的地方,创建个内部类的实例,重写其比较方法即可.

jUnit4单元测试类代码如下:

package test;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;import org.junit.BeforeClass;
import org.junit.Test;public class TestSort {static List list = new ArrayList();//@BeforeClass注解标注的方法会在其它测试方法执行之前先执行,//且只执行一次.@Before注解标注的方法会在每个测试方法之前执行;//此处初始化集合只需要一次,因此使用@BeforeClass.@BeforeClasspublic static void init(){list.add(new Emp("tom",18));list.add(new Emp("jack",20));list.add(new Emp("rose",15));list.add(new Emp("jerry",17));System.out.println("排序前:");for(Object o : list){System.out.println(o);}}/**按age升序排序*/
//  @Test
//  public void testSortAge(){
//      Collections.sort(list);
//      System.out.println("自然排序按age排序后:");
//      for(Object o : list){
//          System.out.println(o);
//      }
//  }
///**按name升序排序*/@Testpublic void testSortName(){Collections.sort(list);System.out.println("自然排序按name升序排序后:");for(Object o : list){System.out.println(o);}}/**使用Comparator比较器按age升序排序*/@Testpublic void testComparatorSortAge(){Collections.sort(list,new Comparator () {@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof Emp && o2 instanceof Emp){Emp e1 = (Emp) o1;Emp e2 = (Emp) o2;return e1.getAge() - e2.getAge();}throw new ClassCastException("不能转换为Emp类型");}});System.out.println("使用Comparator比较器按age升序排序后:");for(Object o : list){System.out.println(o);}}/**使用Comparator比较器按name升序排序*/@Testpublic void testComparatorSortName(){Collections.sort(list,new Comparator () {@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof Emp && o2 instanceof Emp){Emp e1 = (Emp) o1;Emp e2 = (Emp) o2;return e1.getName().compareTo(e2.getName());}throw new ClassCastException("不能转换为Emp类型");}});System.out.println("使用Comparator比较器按name升序排序后:");for(Object o : list){System.out.println(o);}}}

右键空白位置 —> Run As —> JUnit Test —>
运行结果如下:

排序前:
Emp [name=tom, age=18]
Emp [name=jack, age=20]
Emp [name=rose, age=15]
Emp [name=jerry, age=17]
自然排序按name升序排序后:
Emp [name=jack, age=20]
Emp [name=jerry, age=17]
Emp [name=rose, age=15]
Emp [name=tom, age=18]
使用Comparator比较器按age升序排序后:
Emp [name=rose, age=15]
Emp [name=jerry, age=17]
Emp [name=tom, age=18]
Emp [name=jack, age=20]
使用Comparator比较器按name升序排序后:
Emp [name=jack, age=20]
Emp [name=jerry, age=17]
Emp [name=rose, age=15]
Emp [name=tom, age=18]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu编写python脚本_python在ubuntu中的几种方法(小结)

通过ubuntu官方的apt工具包安装通过PPA(Personal Package Archive) 的apt工具包安装通过编译python源代码安装通过ubuntu官方的apt工具包安装安装完成后, 可以用下面的命令进行确认从PPA(Personal Package Archives) 安装apt工具包类似使用apt工具包安装python的工…

Java中String类中compareTo( )方法

compareTo方法是比较简单的,我们可以直接看其源码: 源码如下: public int compareTo(String anotherString) {int len1 value.length;int len2 anotherString.value.length;int lim Math.min(len1, len2);char v1[] value;char v2[] anotherString…

python elif可以单独使用_Python的elif语句怎么用

else和elif语句也可以叫做子句,因为它们不能独立使用,两者都是出现在if、for、while语句内部的。else子句可以增加一种选择;而elif子句则是需要检查更多条件时会被使用,与if和else一同使用,elif是else if 的简写。if和…

SpringMVC接收哪些类型参数参数

支持的数据类型: 基本类型参数: 包括基本类型和 String 类型 POJO 类型参数: 包括实体类,以及关联的实体类 数组和集合类型参数: 包括 List 结构和 Map 结构的集合(包括数组) SpringMVC …

禁用当前的账户win7_系统小技巧:服务客人 开启Windows 10来宾账户

出于安全考虑,Windows 10默认以管理员账户登录,没有开启来宾账户。但对于那些只需在电脑上浏览网页或收看电子邮件的用户,给他们开启来宾账户非常必要。来宾权限或账户的开启,可以通过下面的两种方法。1. 通过系统设置 开启来宾权…

Java之接口的静态方法的定义和使用

格式如下:(就是将abstract或者default换成ststic即可,带上方法体) public static 返回值类型 方法名称(参数列表){方法体----}代码如下: //定义一个接口 public interface MyInterfaceStatic …

三阶魔方还原步骤图_三阶魔方公式图解、教程

三阶魔方公式、魔方图解、魔方教程,从零基础到精通!魔方还原法 Rubics Cube Solution ————先看理论“魔方的还原方法很多精彩内容,尽在百度攻略:https://gl.baidu.com在这里向大家介绍一种比较简单的魔方六面还原方法。这种方…

通俗易懂告诉你CPU/GPU是什么?

通俗易懂告诉你CPU/GPU是什么? CPU CPU( Central Processing Unit, 中央处理器)就是机器的“大脑”,也是布局谋略、发号施令、控制行动的“总司令官”。 CPU的结构主要包括运算器(ALU, Arithmetic and Logic Unit)、控制单元&a…

mysql正在加载_mysql 数据库基本操作

CREATE TABLE classes(id INT PRIMARY KEY AUTO_INCREMENT COMMENT班级表id,name VARCHAR(20) COMMENT班级名称);运行DESCRIBE classes;--------------------------------------------------------| Field | Type | Null | Key | Default | Extra |---------------------------…

CPU和GPU的区别是什么?

CPU是一种微处理器,用于执行程序根据操作(如算术、逻辑、控制和输入-输出)给出的指令。相反,GPU最初设计用于在电脑游戏中渲染图像。CPU强调低延迟,而GPU则强调高吞吐量。 CPU Vs GPU 内容 比较表格定义区别关键不同结论 1. 比较表格 从上…

乌班图配置mysql Java_Ubuntu准备+MySQL+Java

Linux服务器准备1 . 安装Ubuntu系统2 . 修改root用户密码sudo passwd root #修改root账户密码logout # 退出当前账号并重新登录#如果需要关机使用 halt 命令3 . 更新所有Linux的开发包apt-get update4 . 配置相关的编译包apt-get install gcc libpcre3 libpcrecpp* libpcre3-de…

java截取指定字符串中的某段字符

利用字符串的substring函数来进行截取。 其中,substring函数有两个参数: 1、第一个参数是开始截取的字符位置。(从0开始) 2、第二个参数是结束字符的位置1。(从0开始) indexof函数的作用是查找该字符串中…

JSON中的JSON.parseArray()、JSON.parseObject()、JSON.tojsonString()

1、JSON.parseObject和JSON.toJSONString JSON.parseObject,是将Json字符串转化为相应的对象;JSON.toJSONString则是将对象转化为Json字符串。在前后台的传输过程中,JSON字符串是相当常用的,这里就不多介绍其功能了,直…

mysql是gplv3,Affero-GPL和GPLv3之间的区别

解决方案Assume the following:You are developing a server side application in GPL. Now this application serves HTML and not an executable which is directly executed on your machine. That means that another guy could take the GPL code, adapt it and does not …

mysql cluster proxy_GitHub - freedaxin/maya: a mysql cluster proxy powered by node.js

maya安装node.js依赖node v0.8最新版,暂不支持更高的node版本,此处以0.8.7版本为例。root安装(官方要求python2.5.2以上)tar -zxf node-v0.8.7.tar.gzcd node-v0.8.7./configure --prefix/usr/local/sinasrv2/makemake install在root环境变量中增加如下两…

常见HTTP状态码(200、301、302、500等)解说

对网站管理工作者来说有个词不陌生,HTTP状态码,它是用以表示网页服务器HTTP响应状态的3位数字代码。状态码的第一个数字代表了响应的五种状态之一。 1XX系列:指定客户端应相应的某些动作,代表请求已被接受,需要继续处…

linux c语言编写聊天室mysql_Linux平台上用C语言实现与MySQL数据库的连接

测试代码如下://查询操作#include #include #include #define HOST "localhost"#define USERNAME "用户名"#define PASSWORD "密码"#define DATABASE "PublicResourcesDB"int main(void){MYSQL mysql;MYSQL_ROW row;MYSQL_…

java开发安装mysql_从零开始搭建Java开发环境第二篇:如何在windows10里安装MySQL

1 下载安装包1.1 压缩包[外链图片转存失败(img-oesO8K09-1566652568838)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw "点击并拖拽以移动")]1.2 安装包使用安装包安装则无需后续步骤[外链图片转存失败(img-Y3x59iO4-15666525…

java获取json中某个字段

import com.alibaba.fastjson.JSONObject; public class JsonTest {public static void main(String[] args) {// json串(以自己的为准)String str "{"id":"75","shoppingCartItemList":[{"id":"407","num"…

abap数据类型转换_ABAP 中JSON格式的转换与解析

正文RT,JSON是当今十分流行的一种轻量数据格式,广泛地应用于各种数据交换场景中。本文会介绍一种比较简单的将ABAP中的数据转换为JSON格式的方法。(如果你是因为引号的问题搜索到了这篇文章,请直接拉到底部“其它部分”)序列化使用cl_trex_js…