Java8中排序算法比较器的三种写法(使用lambda表达式实现Comparator比较器)_可使用lambda表达式对比较器进行简写-程序员宅基地

技术标签: 排序  Java  lambda  java  CoreJava核心技术卷一 笔记  比较器  

在涉及到数组, 集合等这些地方经常会需要用到排序算法, 在Java中的Collections类中有sort方法, 除了需要传入一个Comparator比较器, 或者需要排序的类实现了Comparable接口;
完整的测试代码附在最后面~

1.使用lambda表达式

我写了3种lambda表达式的写法:
第一种的解释可以看小标题3;
后面两种本质上是一个意思, 传入2个量, 返回比较他们的结果, p在列表的前面, q在列表的后面, 如果希望是升序排列, 就要后面的比前面的大, 就是q.length()-p.length()>0; 如果要降序就是前面的要比后面的大, 就是p.length()-q.length()>0; 也可以直接调用Integer的比较方法, 返回的具体值是两个元素的差值;

Collections.sort(Arrays.asList(s), Comparator.comparingInt(str->(str.length())));
Collections.sort(Arrays.asList(s), (p,q)->{
    
    return Integer.valueOf(p.length()).compareTo(q.length());
});
Collections.sort(Arrays.asList(s), (p,q)->{
    
    return p.length()-q.length();
});
2.自定义Comparator方法(老方法)

我这里写的时候是使用的匿名对象, 自己定义了一个Comparator, 用于比较String类型的比较器, 然后记得覆写Compare方法;

Collections.sort(Arrays.asList(s), new Comparator<String>() {
    
    @Override
    public int compare(String o1, String o2) {
    
        return o1.length()-o2.length();
    }
});

当然也可以这样写, 不用匿名函数比较繁琐一些:

Comparator<String> comp = new Comparator<String>() {
    
    @Override
    public int compare(String o1, String o2) {
    
        return o1.length()-o2.length();
    }
};
Collections.sort(Arrays.asList(s), comp);
3.方法引用

使用方法引用, 传入String类的length方法, 其实和上面的第一种lambda表达式是一个意思;

Collections.sort(Arrays.asList(s), Comparator.comparingInt(String::length));
Collections.sort(Arrays.asList(s), Comparator.comparingInt(str->(str.length())));

不过这种方法似乎对于第二比较关键词就没法实现了, 所以还是得用前面两种方法;


最后, 所有的测试代码如下:
import java.util.*;

public class Test {
    
    public static void main(String[] args) {
    
        String[] s = {
    "GodV","mifengaaa","17shou","Aluka","Gucun","Cpt"};
        Collections.sort(Arrays.asList(s), Comparator.comparingInt(String::length));
        Collections.sort(Arrays.asList(s), Comparator.comparingInt(str->(str.length())));
        Collections.sort(Arrays.asList(s), (p,q)->{
    
            return Integer.valueOf(p.length()).compareTo(q.length());
        });
        Collections.sort(Arrays.asList(s), (p,q)->{
    
            return p.length()-q.length();
        });
        Collections.sort(Arrays.asList(s), new Comparator<String>() {
    
            @Override
            public int compare(String o1, String o2) {
    
                return o1.length()-o2.length();
            }
        });
        System.out.println();
        Arrays.stream(s).forEach(System.out::println);
    }
}

嘿嘿, 7911UUPUP!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33982232/article/details/83684071

智能推荐

C++语法基础-程序员宅基地

文章浏览阅读122次。两种方法 一种是宏定义 一种是const修饰c++风格字符串跟定义变量是一样的 前提是要加上一个头文件#include。

基于springboot2.1.7的springcloud(简单应用)eureka+Feign远程调用服务_org.springframework.boot2.7.17该使用那个版本的feign-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏3次。基于springboot2.1.7的springcloud前言搭建一个父maven项目搭建Eureka注册中心搭建提供者搭建消费者前言不同的springboot对应的springcloud版本可能不一样,就拿springboot2.1.7或者2.1.8来说,它对应的springcloud版本是Greenwich.SR3。这些对应的版本信息都是从官方文档中所得知,所以要养成翻阅官方文档的好习惯。..._org.springframework.boot2.7.17该使用那个版本的feign

【转】加权最小二乘法_带权函数的最小二乘法-程序员宅基地

文章浏览阅读4.9k次,点赞4次,收藏44次。加权最小二乘、迭代最小二乘、抗差最小二乘、稳健最小二乘他们细节的区别我就不过分研究了,不过这些最小二乘似乎表达的是一个意思:构造权重函数,给不同测量值不同的权重,偏差大的值权重小,偏差小的权重大,采用迭代最小二乘的方式最优化目标函数。下面是matlab中robustfit函数权重函数,可以参考一下:..._带权函数的最小二乘法

openstack keystone 添加工程以及用户_openstack将用户加入到用户组-程序员宅基地

文章浏览阅读2.3k次。keystone用户管理可以通过rest api进行,也可以通过相关的命令行进行。python-keystone是keystone认证组件的一个客户端,提供了两种使用方式,(1)python编程接口 (2)命令行接口# Using token auth env variablesexport SERVICE_ENDPOINT=http://127.0.0.1:3535_openstack将用户加入到用户组

基于Python爬虫江苏南京餐厅餐馆数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状-程序员宅基地

文章浏览阅读2.2k次,点赞21次,收藏19次。基于Python爬虫江苏南京餐厅餐馆数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状毕设毕业设计源代码,经营者可以了解顾客的消费习惯、评价意见等信息,从而调整经营策略,提供更好的服务,增加顾客的满意度和忠诚度。消费者可以通过系统获得餐厅餐馆的基本信息、价格、评价等数据,从而能够更好地了解餐厅餐馆的情况,减少了选择就餐场所时的盲目性,提高了消费者的就餐体验。通过数据可视化的方式,餐厅餐馆可以直观地展示自己的特色、菜品、评价等信息,提高了餐厅餐馆的知名度和曝光率,吸引更多的潜在顾客。

AltiumDesigner学习笔记(一)——创建工程与原理图文件-程序员宅基地

文章浏览阅读472次。一、创建工程与原理图文件1、通过菜单创建PCB工程(1)File - New - Project - PCB Project,即可在当前工作区创建新的PCB工程(2)新建工程并不直接在硬盘中创建文件,需要保存:在工程面板中,右键单击新建的工程名 - Save Project,在弹出的对话框中,选择工程存储目录(一般需要为新建的工程新建一个专属目录)并命名工程。2、通过菜单或者工..._简述新建一个项目文件并在该项目文件下新建一个原理图文件的操作

随便推点

社会网络分析能干什么?_社会网络分析用来做什么-程序员宅基地

文章浏览阅读8.5k次,点赞3次,收藏11次。现在来看,社会网络分析可以解决或可以尝试解决下列问题:1-人际传播问题,发现舆论领袖,创新扩散过程;2-小世界理论,六度空间分割理论;3-Web分析,数据挖掘中的关联分析,形成交叉销售,增量销售,也就是啤酒和尿布的故事;4-社会资本,产业链与价值链;5-文本的意义输出,通过追问调查研究文本的关联和意义;6-竞争情报分析;7-语言的关联,符号意_社会网络分析用来做什么

开源软件的总拥有成本指南_使用开源软件需要履行哪些义务-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏5次。使用现成的软件能加速开发进程。然而开源软件(OSS)并不是免费使用的。使用开源软件往往伴随着承担义务和风险,这些都是成本。本指南根据公开信息和我15年的经验总结了使用开源软件进行专业软件开发的成本。_使用开源软件需要履行哪些义务

ROS2 Warning: RosPluginProvider._parse_plugin_xml() plugin file rqt_gui_cpp/plugin.xml not found-程序员宅基地

文章浏览阅读1k次。ROS2运行rqt指令,出现一个警告,RosPluginProvider._parse_plugin_xml() plugin file "C:\dev\ros2_galactic\share\rqt_gui_cpp/plugin.xml" in package "rqt_gui_cpp" not found原因,RosPluginProvider._parse_plugin_xml() plugin 在windows系统上不受支持。参考,https://github.com/ros-v_rospluginprovider._parse_plugin_xml() plugin file "/opt/ros/kinetic/share/rq

精品单页个人导航HTML源码_单页导航源码-程序员宅基地

文章浏览阅读1k次。简约大气精品单页导航-可自行修改其他页面,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面。_单页导航源码

Axure RP医疗在线挂号问诊原型图医院APP原形模板_医疗app原型-程序员宅基地

文章浏览阅读1.1k次。本套原型图主要功能有医疗常识科普、医院挂号、排队预约、在线问诊、医院查找等,基本所有模块都是原创设计。同时页面中使用了大量的动态面板效果,制作了仿真的预约弹窗、医院详情介绍等。你可以将页面直接套用在类似项目上,或直接在模板上拓展页面,快速搭建出高质量的医疗类APP。医疗在线挂号问诊Axure RP原型图医院APP原形模板,是一款原创的医疗类APP,设计尺寸采用iPhone13(375*812px),原型图上加入了仿真手机壳,使得预览效果更加逼真。_医疗app原型

深度缓存算法-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏4次。通常用z轴来计算各对象的距观察平面的距离。处理每一面时,将其到观察平面的深度与前面已经处理表面进行比较。如果一个表面比任一已处理表面都近,则计算其表面颜色并和深度一起存储。场景的可见面由一组在所有表面处理完后存储的表面来表示。该算法需要两个缓存器,一个用来存放颜色的颜色缓存器,一个用来存放深度的深度缓存器。利用深度缓存器进行可见性的判断,消除隐藏对象。其具体做法是首先对深度缓存器和颜色缓存器进行初..._深度缓存算法

推荐文章

热门文章

相关标签