Java8------Sort()
前言
Java 8中的排序算法功能极其强大,无论在写法上还是可读性上都完全超越前代sort。总的来说Java 8中的sort()有两种,第一种替代了老版的sort,用lambda语句优化;第二种用在stream中,可以参照我后面的文章。如果你还在创建Comparator去排序,一定要看看我这篇blog。
代码及分析
首先我们来比较一下比较简单的sort。
对于Array的sort:
- Arrays.sort()只能对基础类型数组进行升序排序!!
- 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()相关推荐
- Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...
- java sort 效率_性能对比:collections.sort vs treeSet sort vs java8 stream.sorted
0 写在前面的话 在项目中有一个排序问题,考虑到未来需要排序的数据量可能很大,想用一个性能较好的排序算法,现在有三套解决方法:jdk提供的集合的sort方法(Collections.sort).一个可 ...
- java8 Arrays.sort 与Arrays.parallelSort
java8 Arrays.sort 与Arrays.parallelSort Sort方法 java8中Arrays.sort()方法有很多重载方式,先来看看对byte类型的排序 static voi ...
- Java8collection.sort_Collections.sort()源码分析(基于JAVA8)
java.lang.Object java.util.Collections简介 此类仅包含操作或返回集合的静态方法. 它包含多样的对集合进行操作的算法,"包装器",返回由指定集合 ...
- java8 sort_Java8 sort方法
Sort方法 今天在使用sort方法的时候发现,不同的继承Collection接口的sort方法有不同的排序表达式 ArrayList arrayList = new ArrayList<> ...
- Java8中Lambda表达式的10个例子
Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 //Before Java 8: new Thread(new Runnable() ...
- java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程
在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...
- Java基础20:Java8新特性终极指南
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结
2019独角兽企业重金招聘Python工程师标准>>> 阅读目录 接口中的默认方法和静态方法 函数式接口和Lambda表达式 Stream API 新的日期和时间 API 杂项改进 ...
- Java8新特性学习记录
前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章, 例如Playing with Java ...
最新文章
- String和StringBuffer的区别,String长度是固定的?
- python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)
- 前端学习(2938):vue对象之间的实例属性ref
- 最近,老王又Get了CDN的新技能
- 复旦计算机考研复试要口试吗,2017复旦大学考研复试:英语口语面试常见问题汇总...
- Mybatis(19)注解实现多表查询
- 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
- 多线程是并行还是并发_并发,并行,线程,进程,异步和同步有相关性吗?
- filters获取data中的数据
- vue中使用scss
- WSL1升级到WSL2
- 取消字体许可限制_字体许可和使用:您需要知道的
- 百行代码,轻松实现机器人语音对话
- MyTime类表示时间(小时+分钟)JAVA
- 天盾linux数据恢复,天盾Linux数据恢复软件
- 朴素贝叶斯(naive bayes)原理小结
- 微信小程序 —— 苹果机的兼容总结
- Sentinel-1A卫星数据下载
- 数字图像处理第五次作业——频域滤波器
- Inter VT技术(硬件虚拟化检测)