java sort 第二个参数_详解java Collections.sort的两种用法

Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:

public static > void sort(List list) {

list.sort(null);

}

public static void sort(List list, Comparator super T> c) {

list.sort(c);

}

首先使用基本类型(此处使用Integer)来演示第一个方法:

static List intList = Arrays.asList(2, 3, 1);

private static void sortBaseTypeByDefaultMode() {

System.out.println("before sort:");

PrintUtil.showList(intList);

System.out.println("=========================");

Collections.sort(intList);

System.out.println("after sort:");

PrintUtil.showList(intList);

}

PrintUtil.showList是自定义的一个打印List类型的方法,此处只关心输出结果就行,如下:

979c49664e3d835b4fbd82ecdc69176e.png

可以看到,默认的排序是正序,那么如何实现逆序呢,这就要使用第二种方式了,即通过实现Comparator接口的compare方法来完成自定义排序,代码如下:

private static void sortBaseTypeByIDefineMode() {

System.out.println("before sort:");

PrintUtil.showList(intList);

System.out.println("=========================");

Collections.sort(intList,new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

// 返回值为int类型,大于0表示正序,小于0表示逆序

return o2-o1;

}

});

System.out.println("after sort:");

PrintUtil.showList(intList);

}

94289e27afc750c2124985737bbb79e1.png

可以看到,已经实现了逆序的排序了。

接下来看看自定义类的排序:

定义一个Emp类:

public class Emp{

private int empno;

private String ename;

public int getEmpno() {

return empno;

}

public void setEmpno(int empno) {

this.empno = empno;

}

public String getEname() {

return ename;

}

public void setEname(String ename) {

this.ename = ename;

}

public Emp(int empno, String ename) {

super();

this.empno = empno;

this.ename = ename;

}

@Override

public String toString()

{

return "empno:\t"+empno+"\tename:\t"+ename;

}

}

首先使用同样的方式来使用Collections.sort方法:

定义泛型违Emp类型的List:

static List empList;

static

{

Emp emp1 = new Emp(2,"Guan YunChang");

Emp emp2 = new Emp(3,"Zhang Fei");

Emp emp3 = new Emp(1,"Liu Bei");

empList = Arrays.asList(emp1,emp2,emp3);

}

对empList进行排序:

632994176db6387a62c9f00fbb08a6cb.png

此时会报错:

The method sort(List) in the type Collections is not applicable for the arguments (List)

意思是参数类型为List时,sort方法无法执行,原因是泛型没有继承Comparable接口,这种方式稍后再说,我们先使用sort方法的第二种形式:

private static void sortEmpByIDefineMode()

{

System.out.println("before sort:");

PrintUtil.showList(empList);

System.out.println("=========================");

Collections.sort(empList,new Comparator() {

@Override

public int compare(Emp o1, Emp o2) {

/*按员工编号正序排序*/

return o1.getEmpno()-o2.getEmpno();

/*按员工编号逆序排序*/

//return o2.getEmpno()-o1.getEmpno();

/*按员工姓名正序排序*/

//return o1.getEname().compareTo(o2.getEname());

/*按员工姓名逆序排序*/

//return o2.getEname().compareTo(o1.getEname());

}

});

System.out.println("after sort:");

PrintUtil.showList(empList);

}

运行结果:

b9dcf3c2afdaf5dedf2a4a2a6eca25e0.png

根据不同的排序方式即可呈现不同的结果。

接下来看看第一种形式的实现,首先让Emp类继承Comparable接口并重写compareTo方法(为了和上面的排序方式区别开,此次按照员工姓名逆序排列):

public class Emp implements Comparable{

/*属性、getter/setter方法、toString方法及构造方法略*/

@Override

public int compareTo(Emp emp) {

/*按员工编号正序排序*/

//return this.getEmpno()-emp.getEmpno();

/*按员工编号逆序排序*/

//return emp.getEmpno()-this.getEmpno();

/*按员工姓名正序排序*/

//return this.getEname().compareTo(emp.getEname());

/*按员工姓名逆序排序*/

return emp.getEname().compareTo(this.getEname());

}

}

使用Collections.sor方法的第一种形式实现:

private static void sortEmpByDefaultMode()

{

System.out.println("before sort:");

PrintUtil.showList(empList);

System.out.println("=========================");

Collections.sort(empList);

System.out.println("after sort:");

PrintUtil.showList(empList);

}

运行结果:

6b61b7b329e7b7e544e46a139974dbda.png

总结:

1.对于String或Integer这些已经实现Comparable接口的类来说,可以直接使用Collections.sort方法传入list参数来实现默认方式(正序)排序;

2.如果不想使用默认方式(正序)排序,可以通过Collections.sort传入第二个参数类型为Comparator来自定义排序规则;

3.对于自定义类型(如本例子中的Emp),如果想使用Collections.sort的方式一进行排序,可以通过实现Comparable接口的compareTo方法来进行,如果不实现,则参考第2点;

4.jdk1.8的Comparator接口有很多新增方法,其中有个reversed()方法比较实用,是用来切换正序和逆序的,代码如下:

private static void sortEmpByIDefineMode()

{

System.out.println("before sort:");

PrintUtil.showList(empList);

System.out.println("=========================");

Comparator comparator = new Comparator() {

@Override

public int compare(Emp o1, Emp o2) {

/*按员工编号正序排序*/

return o1.getEmpno()-o2.getEmpno();

/*按员工编号逆序排序*/

//return o2.getEmpno()-o1.getEmpno();

/*按员工姓名正序排序*/

//return o1.getEname().compareTo(o2.getEname());

/*按员工姓名逆序排序*/

//return o2.getEname().compareTo(o1.getEname());

}

};

/*新的逆序实现方式*/

Collections.sort(empList,comparator.reversed());

System.out.println("after sort:");

PrintUtil.showList(empList);

}

复写的compare方法定义的是按员工编号正序排序,在使用reversed翻转后结果如下:

ad709d628fb3ea70613f4e6a8b829a3e.png

这样就使得排序规则的切换更为方便了。

到此这篇关于详解java Collections.sort的两种用法的文章就介绍到这了,更多相关java Collections.sort用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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

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

相关文章

MVC3 中使用Unity实现依赖注入

前言:前段时间一直在研究依赖注入,不过不是在MVC框架中使用,今天突然想到在MVC中使用Unity实现依赖注入,一时慌了,不知道从何下手,接着就是网上不停的找资料,下面我把我找到的资料分享下&#x…

ms2005 SQL Server设置改为SQL Server身份验证

1.为 SQL Server 2005 Express Edition 或 SQL Server 2005 Developer Edition 启用远程连接 必须为要从远程计算机连接到的每个 SQL Server 2005 实例启用远程连接。为此,请按照下列步骤操作: 1.单击“开始”,依次指向“程序”、“Microsoft…

在Graphite中存储Hystrix的几个月历史指标

Hystrix的杀手级功能之一是低延迟,数据密集型且美观的仪表板 : 即使这只是Hystrix实际操作的副作用(断路器,线程池,超时等),它也往往是最令人印象深刻的功能。 为了使其工作,您必须…

NYOJ-----最少乘法次数

最少乘法次数 时间限制:1000 ms | 内存限制:65535 KB难度:3描述给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。如24:2*222(第一次乘&a…

php投票系统中各个文件的作用说明,PHP开发简单投票系统之投票页面功能模块(二)...

当完成前面的投票后,可以选择点击查看结果查看每个项目的总票数和所有项目的投票百分比。点击“查看结果”后程序会自动计算每个项目的票数和所占百分比。使用了隐藏表单属性隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或发送信…

ref 和out 关键字

ref 和out 关键字 通过对CLR的学习,我们可以知道,CLR默认所有方法参数都是传值的。对于引用类型的对象,传递的是对象的引用(指向对象的指针),被调用者拥有该对象的引用的拷贝,能够修改对象&…

php-cli下载,php-cli-color

一个简单的 PHP 命令行 cli 输出彩色的类库安装composer require wujunze/php-cli-color ~1.0使用getColoredString("Testing Colors class, this is purple string on yellow background.", "purple", "yellow") . PHP_EOL;echo $colors->ge…

您会后悔对Lambdas应用重载!

编写好的API很难。 非常辛苦。 如果您想让用户喜欢您的API,则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡: 有用性 易用性 向后兼容 前向兼容性 之前,在我们的文章: 如何设计良好的常规API中,我们已经…

如何:优化Hive ZooKeeper Lock Manager实施

Hive一直使用ZooKeeper作为分布式锁定管理器来支持HiveServer2中的并发。 基于ZooKeeper的锁管理器在小型环境中运行良好。 但是,随着越来越多的用户从HiveServer迁移到HiveServer2并开始创建大量并发会话,可能会出现问题。 主要问题是Hiveserver2和ZooK…

《图解HTTP》第1章 了解Web及网络基础

《图解HTTP》第1章 了解Web及网络基础 1. 使用 HTTP 协议访问 Web1.1 网络基础 TCP/IP1.2 TCP/IP 协议族1.2.1 TCP/IP 的分层管理 1. 使用 HTTP 协议访问 Web Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议) 的协议作为…

JBoss Forge NetBeans集成–入门

JBoss Forge是构建基于Maven的Java EE项目的最快方法。 因此,它已经具有了令人敬畏的功能,使您作为开发人员的生活更加轻松。 在大多数情况下,使用Forge的人们可能会对创建Web应用程序感兴趣。 有很多入门Forge基础的方法。 您可以查看quick…

SQL语法的重要知识点总结

好几年没写SQL语句了。现在到了新的team,需要用到数据库。作为QA的话时常需要使用客户端工具连接到数据库中找寻或修改数据。这么长时间没使用,一些SQL的使用技巧都忘得差不多了。晚上看了一些资料,花了1个多小时又捡起了曾经的知识。现在总结…

您需要了解的有关默认方法的所有信息

因此,默认方法是……昨天的新闻,对不对? 是的,但是使用一年后,积累了很多事实,我想将这些事实收集在一个地方,供刚开始使用它们的开发人员使用。 甚至有经验的人都可以找到他们不知道的一两个细…

php 在函数里打开链接,JavaScript中打开链接的几种方法介绍

如何使用JavaScript打开链接?本篇文章我们就来看看使用JavaScript打开链接的几种方法介绍。我们先来看一段代码使用Javascript实现打开链接,需要在location.href中替换要打开的链接的URL。location.href http://www.php.cn/blog.html;通过上述代码我们可…

三代基因组测序技术原理简介

考虑到cnblog不适合基因组领域这种类型的文章, 最终,我自己开通了公众号:碱基矿工,欢迎感兴趣的同学关注! 也可以关注我的知乎:https://www.zhihu.com/people/yellowtree/activities 2018年1月修改&#x…

Java并发教程–锁定:显式锁定

1.简介 在许多情况下,使用隐式锁定就足够了。 有时,我们将需要更复杂的功能。 在这种情况下, java.util.concurrent.locks包为我们提供了锁定对象。 当涉及到内存同步时,这些锁的内部机制与隐式锁相同。 区别在于显式锁提供了其他…

lda php,主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现

[导读]百度最近开源了一个新的关于主题模型的项目。文档主题推断工具、语义匹配计算工具以及基于工业级语料训练的三种主题模型:LatentDirichlet Allocation(LDA)、SentenceLDA 和Topical Word Embedding(TWE)。一、Familia简介帮Familia,打个小广告~ F…

最短路径问题matlab作图,[MATLAB基础] matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点...

matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点 程序如下function shortestpath(w,p,q)c->;l;f;tsize(w);mt(1,1);azeros(m,m);vw;for k1:mfor i1:mfor j1:mb[w(i,j),w(i,k)w(k,j)];w(i,j)min(b);if w(i,j)~v(i,j)a(i,j)k;%a(i,j)10*a(i,j)k;vw;endendendendw;…

快速浏览JAX-RS请求与方法匹配

在本文中,我们来看一下JAX-RS中与资源方法匹配的HTTP请求 。 它是JAX-RS的最基本功能之一。 通常,使用JAX-RS API的开发人员不会接触(或真正不需要知道) 匹配过程的细节,请放心,由于我们的RESTful&#xff…

$stat php,php stat函数怎么用

php stat函数用于返回关于文件的信息,其语法是fstat(file),参数file必需,指规定要检查的文件。php stat函数怎么用?定义和用法stat() 函数返回关于文件的信息。语法fstat(file)参数file必需。规定要检查的文件。说明获取由 file 指…