前言

Java 8中的排序算法功能极其强大,无论在写法上还是可读性上都完全超越前代sort。总的来说Java 8中的sort()有两种,第一种替代了老版的sort,用lambda语句优化;第二种用在stream中,可以参照我后面的文章。如果你还在创建Comparator去排序,一定要看看我这篇blog。

代码及分析

首先我们来比较一下比较简单的sort。
对于Array的sort:

  1. Arrays.sort()只能对基础类型数组进行升序排序!!
  2. Arrays.sort()可以对String或User类等进行自定义排序。

对于List.sort(), 可以用lambda表达式自定义sort

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();initIntArray(list);list.sort((i1,i2)->i2-i1);System.out.println(list);
}
private static void initIntArray(List l) {for (int i = 0; i < 10; i++) {l.add((int)(100 * Math.random() / 1));}}

输出结果为:

[83, 68, 61, 53, 33, 29, 28, 21, 15, 11]


下面来说一下类的sort
如果类只有单一条件的比较,直接用上文所提到的lambda表达式排序即可。但若有多重的条件,比如先按name排序,name相同的话按age排序。可用Comparator中的thenComparing方法定义次要排序条件。reverse方法可以调整顺序或者倒序。代码如下:

public class Sort {public static class Overwatch {String name;int age;public Overwatch(String name, int age) {// TODO Auto-generated constructor stubthis.name = name;this.age = 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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn name+":"+age;}}public static void main(String[] args) {List<Overwatch> l = new ArrayList<>();initList(l);
//      l.sort((Overwatch o1, Overwatch o2)->(o1.name.compareTo(o2.name)));l.sort(Comparator.comparing(Overwatch::getName).reversed().thenComparingInt(Overwatch::getAge).reversed());
//      l.sort(Comparator.comparing(Overwatch::getName).reversed().
//                        thenComparingInt(Overwatch::getAge));
//      l.sort(Comparator.comparing(Overwatch::getName).
//                        thenComparingInt(Overwatch::getAge));
//      l.sort(Comparator.comparing(Overwatch::getName).
//                        thenComparingInt(Overwatch::getAge).reversed());System.out.println(l);}private static void initList(List<Overwatch> list) {// TODO Auto-generated method stublist.add(new Overwatch("Tracer",23));list.add(new Overwatch("Tracer",19));list.add(new Overwatch("Tracer",24));list.add(new Overwatch("Genji",39));list.add(new Overwatch("Reinhardt",61));list.add(new Overwatch("Reinhardt",45));list.add(new Overwatch("Mercy",37));list.add(new Overwatch("Mercy",27));list.add(new Overwatch("Mccree",39));list.add(new Overwatch("Ana",49));list.add(new Overwatch("Dva",26));}
}

四种排序结果分别如下(注意reverse的位置):

name: 小->大; age: 大->小
[Ana:49, Dva:26, Genji:39, Mccree:39, Mercy:37, Mercy:27, Reinhardt:61, Reinhardt:45, Tracer:24, Tracer:23, Tracer:19]

name: 大->小; age: 小->大
[Tracer:19, Tracer:23, Tracer:24, Reinhardt:45, Reinhardt:61, Mercy:27, Mercy:37, Mccree:39, Genji:39, Dva:26, Ana:49]

name: 小->大; age: 小->大
[Ana:49, Dva:26, Genji:39, Mccree:39, Mercy:27, Mercy:37, Reinhardt:45, Reinhardt:61, Tracer:19, Tracer:23, Tracer:24]

name: 大->小; age: 大->小
[Tracer:24, Tracer:23, Tracer:19, Reinhardt:61, Reinhardt:45, Mercy:37, Mercy:27, Mccree:39, Genji:39, Dva:26, Ana:49]

Java8------Sort()相关推荐

  1. Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用

    摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...

  2. java sort 效率_性能对比:collections.sort vs treeSet sort vs java8 stream.sorted

    0 写在前面的话 在项目中有一个排序问题,考虑到未来需要排序的数据量可能很大,想用一个性能较好的排序算法,现在有三套解决方法:jdk提供的集合的sort方法(Collections.sort).一个可 ...

  3. java8 Arrays.sort 与Arrays.parallelSort

    java8 Arrays.sort 与Arrays.parallelSort Sort方法 java8中Arrays.sort()方法有很多重载方式,先来看看对byte类型的排序 static voi ...

  4. Java8collection.sort_Collections.sort()源码分析(基于JAVA8)

    java.lang.Object java.util.Collections简介 此类仅包含操作或返回集合的静态方法. 它包含多样的对集合进行操作的算法,"包装器",返回由指定集合 ...

  5. java8 sort_Java8 sort方法

    Sort方法 今天在使用sort方法的时候发现,不同的继承Collection接口的sort方法有不同的排序表达式 ArrayList arrayList = new ArrayList<> ...

  6. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子  例1 用Lambda表达式实现Runnable接口 Java代码   //Before Java 8: new Thread(new Runnable() ...

  7. java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

    在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...

  8. Java基础20:Java8新特性终极指南

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  9. 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结

    2019独角兽企业重金招聘Python工程师标准>>> 阅读目录 接口中的默认方法和静态方法 函数式接口和Lambda表达式 Stream API 新的日期和时间 API 杂项改进 ...

  10. Java8新特性学习记录

    前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章, 例如Playing with Java ...

最新文章

  1. String和StringBuffer的区别,String长度是固定的?
  2. python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)
  3. 前端学习(2938):vue对象之间的实例属性ref
  4. 最近,老王又Get了CDN的新技能
  5. 复旦计算机考研复试要口试吗,2017复旦大学考研复试:英语口语面试常见问题汇总...
  6. Mybatis(19)注解实现多表查询
  7. 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
  8. 多线程是并行还是并发_并发,并行,线程,进程,异步和同步有相关性吗?
  9. filters获取data中的数据
  10. vue中使用scss
  11. WSL1升级到WSL2
  12. 取消字体许可限制_字体许可和使用:您需要知道的
  13. 百行代码,轻松实现机器人语音对话
  14. MyTime类表示时间(小时+分钟)JAVA
  15. 天盾linux数据恢复,天盾Linux数据恢复软件
  16. 朴素贝叶斯(naive bayes)原理小结
  17. 微信小程序 —— 苹果机的兼容总结
  18. Sentinel-1A卫星数据下载
  19. 数字图像处理第五次作业——频域滤波器
  20. Inter VT技术(硬件虚拟化检测)

热门文章

  1. 图解|什么是蒙提霍尔问题(三门问题)
  2. mysql 备份库的shell_shell脚本之 备份mysql数据库
  3. PLM( 产品生命周期管理)的简单介绍
  4. 【独家专访】李飞飞团队、康奈尔Weinberger团队、密歇根大学最新CVPR热点论文作者解读
  5. 最佳量化交易的计算机操作系统
  6. 推荐系统学习笔记召回策略之基于内容召回
  7. NMOS 与 PMOS
  8. LNK1181 无法打开输入文件“winmm.lib”
  9. 如何在Jetson NANO上安装无线WIFI模块
  10. XTU oj 1112 三点共线