jdk8特性Collections.sort()的使用

2023-11-09

Java中Collections.sort()的使用学习记录

在日常开发中,很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中。他们都提共了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是 可比较的。

怎么让一个对象是 可比较的,那就需要该对象实现 Comparable 接口啦。然后重写里面的
compareTo()方法。我们可以看到Java中很多类都是实现类这个接口的 如:Integer,Long 等等。。。

假设我们有一个学生类,默认需要按学生的年龄字段 age 进行排序 代码如下:


@Data
public class Student implements Comparable<Student>{
    private Integer id;
    private Integer age;
    private String name;

    @Override
    public int compareTo(Student o) {
        //降序
        //return o.age - this.age;
        //升序
        return this.age - o.age;
    }

    public Student() {
    }

    public Student(Integer id,  Integer age,String name) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

  
}

这里说一下重写的 public int compareTo(Student o){} 这个方法,它返回三种 int 类型的值: 负整数,零 ,正整数。

返回值 含义
负整数 当前对象的值 < 比较对象的值 , 位置排在前
当前对象的值 = 比较对象的值 , 位置不变
正整数 当前对象的值 > 比较对象的值 , 位置排在后

测试代码:

  public static void main(String args[]){
        List<Student> list = new ArrayList<>();
        list.add(new Student(1,25,"关羽"));
        list.add(new Student(2,21,"张飞"));
        list.add(new Student(3,18,"刘备"));
        list.add(new Student(4,32,"袁绍"));
        list.add(new Student(5,36,"赵云"));
        list.add(new Student(6,16,"曹操"));
        System.out.println("排序前:");
        for (Student student : list) {
            System.out.println(student.toString());
        }
        //使用默认排序
        Collections.sort(list);
        System.out.println("默认排序后:");
        for (Student student : list) {
            System.out.println(student.toString());
        }
}

测试结果:

排序前:
Student(id=1, age=25, name=关羽)
Student(id=2, age=21, name=张飞)
Student(id=3, age=18, name=刘备)
Student(id=4, age=32, name=袁绍)
Student(id=5, age=36, name=赵云)
Student(id=6, age=16, name=曹操)
默认排序后:
Student(id=6, age=16, name=曹操)
Student(id=3, age=18, name=刘备)
Student(id=2, age=21, name=张飞)
Student(id=1, age=25, name=关羽)
Student(id=4, age=32, name=袁绍)
Student(id=5, age=36, name=赵云)

比较器的使用

这个时候需求又来了,默认是用 age 排序,但是有的时候需要用 id 来排序怎么办? 这个时候比较器 :Comparator 就排上用场了。

Comparator 的使用有两种方式:

Collections.sort(list,Comparator);
list.sort(Comparator);

其实主要是看 Comparator 接口的实现,重写里面的 compare 方法。代码如下:

//自定义排序1
Collections.sort(list, new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getId() - o2.getId();
    }
});

compare(Student o1, Student o2) 方法的返回值跟 Comparable<> 接口中的 compareTo(Student o) 方法 返回值意思相同。另一种写法如下:

//自定义排序2
list.sort(new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getId() - o2.getId();
    }
});

自定义排序后01:
Student(id=6, age=16, name=曹操)
Student(id=5, age=36, name=赵云)
Student(id=4, age=32, name=袁绍)
Student(id=3, age=18, name=刘备)
Student(id=2, age=21, name=张飞)
Student(id=1, age=25, name=关羽)
自定义排序后02:
Student(id=1, age=25, name=关羽)
Student(id=2, age=21, name=张飞)
Student(id=3, age=18, name=刘备)
Student(id=4, age=32, name=袁绍)
Student(id=5, age=36, name=赵云)
Student(id=6, age=16, name=曹操)

原文连接:http://blog.csdn.net/qq_23179075/article/details/78753136

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdk8特性Collections.sort()的使用 的相关文章

  • Spring中如何映射Request参数?

    我正在使用 Spring MVC 当用户注册后 一封电子邮件将发送到用户帐户 这工作正常 我还将加密的用户ID发送到用户电子邮件 为此我编写了一个模板
  • eclipse mylyn 与 redmine

    是否可以将mylyn连接到redmine而不需要redmine中的rest支持 有一个链接http download eclipse org mylyn incubator 3 8 http download eclipse org myl
  • 如何使用 Windows 上运行的 Java 服务检测用户活动?

    我的目标是使用 Java 创建一个系统监控应用程序 我想知道用户何时在 Windows PC 上进行活动 结果会是这样的 8 00 8 15 活动 9 12 10 29 活动 12 24 15 34 活动 我对任何其他信息 按下了哪个键 使
  • 有没有办法获取 JList 中的所有元素?

    我想知道是否有一种方法可以检索已添加到 JList 的所有元素的列表 例如 我希望 JList 从自定义单元格渲染器返回字符串或 JLabels 的数组或列表 您可以使用getModel http docs oracle com javas
  • Spring批处理2.2 JavaConfig

    我正在尝试让 Spring Batch 2 2 与 JavaConfig 一起使用 如今他们有一个 EnableBatchProcessing设置很多东西的注释 默认情况下 该注释使用数据源作为其作业数据 但我们不想保存此数据 也不想为其创
  • java中简单程序中的“未为类型定义方法”错误

    所以我只是想学习 Java 在观看了一些教程并阅读了一些基本内容之后 我对为什么它无法运行感到困惑 package Test public class TestProg public static void main String args
  • java应用程序,线程在终止MySQL连接后挂起

    我有一些工作线程正在运行 其中包括 MySQL 和 mysql connector java 5 1 20 当我杀死一些 SQL 语句 使用 mysql 客户端的kill 连接id 时 java线程挂起 这应该抛出一些异常 jstack 打
  • 如何在Java中验证字符串是否是有效的URL(包括深层链接)[重复]

    这个问题在这里已经有答案了 如何在 Java 中验证字符串是否是有效的 URL 包括深层链接 对于以下测试用例 该方法应返回 true http www example com gizmos https www example com gi
  • Finalize() 何时执行? [复制]

    这个问题在这里已经有答案了 在一次采访中我被问到 假设 JVM 在 A 类对象未被使用时运行 gc class A some code here protected void finalize code here 它是否保证finalize
  • 如何更新 Websphere 7 以使用 EL2.2?

    这就是我所做的 按照此林肯 巴克斯特的帖子 http ocpsoft com java jsf2 java jsf2 how to add the magic of el el2 to jsf 我下载了 el api 2 2 jar 和 e
  • 如何显示 javadoc 代码块中的泛型?

    我有一个 javadoc 代码块 我想在其中编写一个包含泛型的代码示例 如下所示 public interface SomeInterface
  • JRuby调用了错误的方法

    我在调用 Java 方法时遇到了一个奇怪的问题JRuby http en wikipedia org wiki JRuby 在我的 Java 类中 这些方法定义了两次 看来 JRuby 调用了错误的方法 所以我尝试使用java method
  • 方法中缺少 return 语句错误

    我正在尝试编写一个返回计算机 MAC 地址字符串的静态方法 该函数本身可以在此处找到 http www mkyong com java how to get mac address in java http www mkyong com j
  • Java - 动态创建子类

    我想以编程方式创建一个子类 我想我的选择很少 Javassist CGLib BCEL 或 ASM 用例是一个应用程序的内部是面向类的 而扩展是基于类的 因此 我不能将单个类作为由外部化脚本驱动的多个扩展的基础 现在 我该怎么做呢 我找到了
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • Scala 不可变 Map 速度慢

    当我创建地图时 我有一段代码 val map gtfLineArr 8 split map split collect case Array k v gt k v toMap 然后我使用这张地图来创建我的对象 case class MyOb
  • GridLayout 中的 JLabel

    如何添加JLabel出于GridLayout 我有一个 8x8 网格布局 Container content getContentPane content setLayout new GridLayout 8 8 2 2 for int f
  • 解决SecurityException:权限拒绝:启动意图。我需要什么许可?

    我想从应用程序打开游戏商店 在三星手机上还好 但在一加手机上却失败了 我不知道在哪里alibaba来自 真奇怪 异常 java lang SecurityException 权限拒绝 启动意图 act android intent acti
  • 如何处理JFreeChart中的SpiderWebPlot?

    发现 JFreeChart 我在使用时遇到了问题蜘蛛网情节 http www jfree org jfreechart api javadoc org jfree chart plot SpiderWebPlot html 这就是我今天所拥
  • DocumentBuilder 解析产生无效字节 2 of 4 字节 UTF-8 序列错误

    我正在尝试解析包含字符串的字节数组Impresi n in XML final DocumentBuilderFactory builderFactory DocumentBuilderFactory newInstance final D

随机推荐

  • k8s-hostpath存储使用

    参考网址 https github com nailgun k8s hostpath provisioner 运行k8s hostpath provisioner 下载github项目 git clone https github com
  • AlexNet网络结构详解(含各层维度大小计算过程)与PyTorch实现

    AlexNet网络结构详解 含各层维度大小计算过程 与PyTorch实现 AlexNet网络架构 1 模型架构 2 AlexNet网络架构的贡献 3 Pytorch代码实现 AlexNet网络架构 1 模型架构 AlexNet网络结构相对简
  • 使用Go实现GoF的23种设计模式(一)

    前言 从1995年GoF提出23种设计模式到现在 25年过去了 设计模式依旧是软件领域的热门话题 在当下 如果你不会一点设计模式 都不好意思说自己是一个合格的程序员 设计模式通常被定义为 设计模式 Design Pattern 是一套被反复
  • python可以实现手机定位吗_用Python实现通讯定位功能——PYBOARD V702评测

    1 boot py 这个脚本文件执行时 开发板启动 它设置了开发板的多个选项参数 2 Main py 在boot py运行后被执行 包含python程序的主要脚本 3 Pybcdc inf Windows驱动文件 用来配置USB端口 4 R
  • Linux网络编程基础知识

    网络编程 本质 使用操作系统的接口函数 使得应用程序具备收发网络数据的能力 核心概念 协议 为进行数据通信而预定义的数据规则 地址 网络通信中的用于标识设备的整数值 端口号 设备为收发数据而指定的数值 用于标识具体链接 可理解为 设备中用于
  • 关于2020HUEL_ACM暑期集训八月集训计划变更

    时间飞逝若白驹过隙 转眼2020疫情期间这个特殊的暑假已经过去一半 因为一些原因我们第二个月不与hky一起训练了 正常周赛 咱们的集训计划也会发生相应的改变 具体如下 时间安排 八月共四个周 第一周 继续学习最小生成树 2天 和最短路 4天
  • 屏幕适配方案

    屏幕dp px换算公式 其中width height为我们的手机屏幕宽高 即1920 1080 inch为对角尺寸 常见5 5寸 5 0寸等 public void getAndroiodScreenProperty WindowManag
  • 机器学习集成模型学习——投票集成Voting(二)

    Voting集成 投票机制就是多个模型分别预测 然后投票 票数最高的就是整个模型最后的效果 案例代码 from sklearn linear model import LogisticRegression from sklearn naiv
  • github访问很慢的问题

    github访问很慢的问题 公司一直用着svn 之前也的确用过github的版本管理 但是一直都是可视化的操作 这几天面试了几名前端 问了一下发现他们在之前的公司里都是用git的 于是今天好好温故了一下怎么用命令行进行一下git操作 首先要
  • R语言合并数据框的行与列

    合并数据框的行与列 大家好 这里是想做生信大恐龙 的生信小白 先赞后看养成习惯 还没关注的小伙伴点点关注不迷路 今天熟悉数据操作中的数据合并 数据合并 合并数据框的行与列 一 rbind 和cbind 函数 二 merge 函数 总结 一
  • 【日常实用】git rebase合并多笔为一笔提交

    前言 在日常开发中 经常会遇到master分支和自己的分支已经渐行渐远 分叉久已 此时并不能用get merge 的方式合并代码了 这个时候想要将多笔提交合并成一笔并解决好冲突提交话 get rebase 就派上了用场了 举例说明 一 新建
  • kibana使用

    数据导出 查询完数据后 数据量很大 我们要对数据进行分析 可以导出来用excel分析 导出很简单 就是先保存后分享就可以了 使用kibana界面导出数据 我们要进行重复行统计的时候 可以使用excel的数据透视表 很强大 excel如何快速
  • EM算法

    尽管最大似然估计 MLE 和EM都可以找到 最佳拟合 参数 但是它们查找模型的方式却大不相同 MLE首先累积所有数据 然后使用该数据构建最可能的模型 EM首先对参数进行猜测 考虑丢失的数据 然后对模型进行调整以适合猜测和观察到的数据 该算法
  • 【IDEA】IDEA git log 点击 没有代码变更

    文章目录 1 概述 1 概述 Git log 下查看分支提交的信息 结果只有提交信息 没有代码变更信息 如下图 这里有坑 不是消失了 是下拉框拉倒最上面了 这里有条线 往下拉就能看到了
  • 使用kubeadm工具升级kubernetes

    一 背景 kubeadm部署的kubernetes集群进行升级 通常先升级控制节点 控制节点升级完成后再升级工作节点 本博文只升级了控制节点 工作节点按照相同的流程进行升级即可 环境说明 主机名 节点 11 0 1 200 k8s客户端操控
  • show_space存储过程脚本

    CREATE OR REPLACE PROCEDURE show space p segname 1 IN VARCHAR2 p type 1 IN VARCHAR2 DEFAULT TABLE p space IN VARCHAR2 DE
  • 程序下载微云

    https share weiyun com 5OxmUiI
  • python/sympy计算施密特正交化向量

    sympy的符号计算功能很强大 学习矩阵分析 重温了线性代数中施密特正交化的方法 正好可以用sympy解决一些计算问题 施密特正交化 也称 Gram Schmidt 正交化过程 Gram Schmidt Orthogonalization
  • 【linux】01 dnf 命令安装(新的代替yum 的安装方式)

    一 dnf 介绍 参考文章 DNF 是新一代的 rpm 软件包管理器 他首先出现在 Fedora 18 这个发行版中 而最近 它取代了 yum 正式成为 Fedora 22 的包管理器 DNF 包管理器克服了 YUM 包管理器的一些瓶颈 提
  • jdk8特性Collections.sort()的使用

    Java中Collections sort 的使用学习记录 在日常开发中 很多时候都需要对一些数据进行排序的操作 然而那些数据一般都是放在一个集合中如 Map Set List 等集合中 他们都提共了一个排序方法 sort 要对数据排序直接