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类型的方法,此处只关心输出结果就行,如下:

可以看到,默认的排序是正序,那么如何实现逆序呢,这就要使用第二种方式了,即通过实现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);

}

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

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

定义一个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进行排序:

此时会报错:

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);

}

运行结果:

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

接下来看看第一种形式的实现,首先让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);

}

运行结果:

总结:

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翻转后结果如下:

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

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

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

  1. java list for循环遍历_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  2. java中static修饰函数_详解java中static关键词的作用

    在java中,static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载 ...

  3. java中的invoke方法_详解Java中Method的Invoke方法

    在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到M ...

  4. java遍历是什么意思_详解java中多种通用遍历方式

    下面小编就为大家带来一篇java集合遍历的几种方式总结及详细比较.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 集合类的通用遍历方式, 用迭代器迭代:Iterator ...

  5. java super关键字的作用_详解Java编程中super关键字的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...

  6. java中的values函数_详解java 中valueOf方法实例

    case1:Object 对象转String 需要强调的是String.valueOf()方法,当参数为类型是object,且值时null的时候他的处理方式public static String v ...

  7. JAVA下载文件的几_详解Java文件下载的几种实现方式

    Java文件下载的几种方式,具体如下: public HttpServletResponse download(String path, HttpServletResponse response) { ...

  8. gerrit 数据迁移_详解git仓库迁移的两种解决方案

    Git仓库迁移而不丢失log的方法 要求能保留原先的commit记录,应该如何迁移呢? 同时,本地已经clone了原仓库,要配置成新的仓库地址,该如何修改呢? 注意:如果使用了代码审核工具Gerrit ...

  9. 怎么让手机变成震动器_详解iPhone 手机标配的两种技术:线性马达和3Dtouch,有多好用?...

    iPhone手机广受大家喜欢不是没有道理的,XR取消了3Dtouch引来众多玩家的不满,那么,iPhone手机有哪些让你感觉舒服的技术呢?今天机哥就先来说一说线性马达和3Dtouch. 我们在玩手机时 ...

最新文章

  1. Android -- 利用Broadcast开启Service
  2. 通信工程和计算机科学会议,计算机科学论坛--2019年IEEE第二届国际计算机与通信工程技术会议(CCET 2019)...
  3. window环境中Jupyter notebook使用虚拟环境
  4. how to figure out problems in the ardunio nano force senser? 1,2,3,4
  5. oracle rac alter日志,ORACLE 11G RAC 增加日志组及增大日志文件
  6. 机器学习预测信贷风险
  7. Python+OpenCV:理解k近邻(kNN)算法(k-Nearest Neighbour (kNN) algorithm)
  8. elasticsearch备份与恢复4_使用ES-Hadoop将ES中的索引数据写入HDFS中
  9. iOS 手机摇一摇功能
  10. Parallels Desktop 17 亮点整理,7 大改进与变化
  11. 博图多版本共存安装教程 博图V14V15V16V17下载地址
  12. 一个Android沉浸式状态栏上的黑科技
  13. PHP靶向药,第三代靶向药已成功进入中国肺癌指南
  14. Beaglebone Black 和树莓派
  15. 视频演示-Snapper快捷优秀的音频预览播放器演示
  16. Navicat 图形化界面工具
  17. 开运算和闭运算的作用
  18. 微信web版接口api
  19. time(),date(),microtime()三者的区别
  20. informatica使用问题汇总

热门文章

  1. 发言稿开场白范文_发言稿开场白
  2. jwt获取token_Koa开发之koa-jwt工作过程
  3. linux查看主机脚本,简单的bash脚本查看任意网段的在线主机
  4. 通信调制体制设计之64QAM性能分析MATLAB仿真及代码
  5. 下载 沙耶之歌Android_沙耶之歌安卓版apk-沙耶之歌下载手机版v1.2-飘荡下载
  6. JAVA中的适配器应用_Java适配器模式应用之电源适配器功能详解
  7. windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...
  8. 计算机学院肖鹏,肖鹏-生命科学与技术学院
  9. 红黑树操作详解——很形象的过程
  10. 7.9 规划Varnish缓存