Java 集合 sort()

2023-11-06

今天我们将研究Java集合的排序方法。在与java中的集合,我们经常需要对数据进行排序。

Java 集合 sort()

Java Collections类为我们提供了非常方便的方法Collections.sort()对所有进行排序List实施例如链表 and 数组列表。有两个超载Collections.sort()方法,它们是:

  1. sort(List list):按自然顺序的升序对列表中的元素进行排序。
  2. sort(List list, Comparator c):按照列表中元素的顺序对列表中的元素进行排序比较器.

注意上述方法签名使用generics但为了阅读方便,我在这里删除了它们。让我们一一深入探讨如何以及何时使用这两种方法。

Java集合排序(List列表)

考虑一个ArrayList of String:

List<String> fruits = new ArrayList<String>();
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Banana");
fruits.add("Grape");

现在,我们将使用它进行排序Collections.sort():

Collections.sort(fruits);
// Print the sorted list
System.out.println(fruits);

该程序的输出将是:

[Apple, Banana, Grape, Orange]

因此,我们可以看到Collections.sort()已按词汇顺序对字符串列表进行排序。它不会返回任何东西。如果我们有一个自定义对象列表怎么办?当然,我们也可以对它们进行排序。考虑一类水果:

package com.journaldev.collections;
public class Fruit{
    private int id;
    private String name;
    private String taste;

    Fruit(int id, String name, String taste){
        this.id=id;
        this.name=name;
        this.taste=taste;
    }
}

让我们创建一个水果列表:

List<Fruit> fruitList=new ArrayList<Fruit>();
Fruit apple=new Fruit(1, "Apple", "Sweet");
Fruit orange=new Fruit(2, "Orange", "Sour");
Fruit banana=new Fruit(4, "Banana", "Sweet");
Fruit grape=new Fruit(3, "Grape", "Sweet and Sour");

fruitList.add(apple);
fruitList.add(orange);
fruitList.add(banana);
fruitList.add(grape);

In order to sort this list, if we directly use the Collections.sort(List list), it will give a Compile Time Error because there is no natural ordering defined for the Fruit objects. So, it doesn’t know how to sort this list. java collections sort, Java Collections.sort() method For objects to have a natural order they must implement the interface java.lang.Comparable. The Comparable interface has a method compareTo(), which returns a negative, 0, a positive if the current value is less than, equal to, or greater than the value we are comparing with, respectively. Let’s enhance the Fruit class to implement Comparable interface. We are defining that the natural order of sorting is based on the “id” field of Fruit:

package com.journaldev.collections;
public class Fruit implements Comparable<Object>{
    private int id;
    private String name;
    private String taste;

    Fruit(int id, String name, String taste){
        this.id=id;
        this.name=name;
        this.taste=taste;
    }
    @Override 
    public int compareTo(Object o) {
        Fruit f = (Fruit) o; 
        return this.id - f.id ;
    }
}

现在我们已经实施了Comparable,我们可以对列表进行排序而不会出现任何错误:

Collections.sort(fruitList);
fruitList.forEach(fruit -> {
    System.out.println(fruit.getId() + " " + fruit.getName() + " " + 
      fruit.getTaste());
});

输出如下:

1 Apple Sweet
2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet

Java集合排序(列表列表,比较器c)

为了定义与元素的自然排序不同的自定义排序逻辑,我们可以实现java.util.Comparator接口并传递它的实例作为第二个参数sort()。让我们考虑一下,我们想要根据水果的“名称”字段来定义排序。我们实施Comparator,并在其compare()方法中,我们需要编写比较的逻辑:

package com.journaldev.collections;

class SortByName implements Comparator<Fruit> {
    @Override
    public int compare(Fruit a, Fruit b) {
        return a.getName().compareTo(b.getName());
    }
}

现在,我们可以使用这个比较器对其进行排序:

Collections.sort(fruitList, new SortByName());

输出如下:

1 Apple Sweet
4 Banana Sweet
3 Grape Sweet and Sour
2 Orange Sour

我们也可以在运行时提供排序逻辑,而不是使用 lambda 函数为 Comparator 编写新类:

Collections.sort(fruitList, (a, b) -> {
    return a.getName().compareTo(b.getName());
});

Java Collections.reverseOrder

默认情况下,Collection.sort按升序执行排序。如果我们想以相反的顺序对元素进行排序,我们可以使用以下方法:

  1. reverseOrder():返回一个Comparator这强制了集合元素的自然顺序相反。
  2. reverseOrder(Comparator cmp):返回一个Comparator这对指定的比较器施加了相反的排序。

以下是这两种方法的示例:

Java集合reverseOrder()示例

Collections.sort(fruits, Collections.reverseOrder());
System.out.println(fruits);

它将按相反的字母顺序输出水果:

[Orange, Grape, Banana, Apple]

Java集合reverseOrder(比较器cmp)示例

Collections.sort(fruitList, Collections.reverseOrder(new SortByName()));
fruitList.forEach(fruit -> {
    System.out.println(fruit.getId() + " " + fruit.getName() + " " + 
      fruit.getTaste());
});

Output:

2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet
1 Apple Sweet

这就是 Java 集合 sort() 方法及其示例的全部内容。参考:API Doc

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

Java 集合 sort() 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 如何在 Ubuntu 18.04 上安装和配置 Redmine

    Redmine 是最流行的开源项目管理和问题跟踪软件工具之一 它是跨平台和跨数据库的 构建在 Ruby on Rails 框架之上 Redmine包括对多个项目 wiki 问题跟踪系统 论坛 日历 电子邮件通知等的支持 本教程介绍如何在 U
  • 如何在 CentOS 8 上使用 VSFTPD 设置 FTP 服务器

    FTP 文件传输协议 是一种客户端 服务器网络协议 允许用户与远程计算机传输文件 有许多可用于 Linux 的开源 FTP 服务器 最流行和最常用的服务器是PureFTPd ProFTPD and vsftpd 在本教程中 我们将在 Cen
  • 如何在 Ubuntu 20.04 上制作 Minecraft 服务器

    我的世界 是有史以来最受欢迎的游戏之一 这是一款沙盒视频游戏 玩家可以探索无限的世界并建造不同的结构 从简单的房屋到高耸的摩天大楼 本教程介绍如何在 Ubuntu 20 04 上创建 Minecraft 服务器 我们将使用 Systemd
  • 如何通过 SSH 隧道连接 MySQL

    默认情况下 MySQL 服务器仅侦听本地主机 这意味着它只能由同一主机上运行的应用程序访问 但是 在某些情况下 您可能希望从远程位置连接到服务器 一种选择是配置MySQL服务器允许远程连接 但这需要管理权限 并且可能会导致安全风险 更安全的
  • Bash 数组

    数组是最常用和基本的数据结构之一 您可以将数组视为一个变量 其中可以存储多个变量 在本文中 我们将介绍 Bash 数组 并解释如何在 Bash 脚本中使用它们 Bash 数组 Bash 支持一维数字索引和关联数组类型 数值数组使用整数引用
  • 如何在 Debian 10 上设置 Apache 虚拟主机

    Apache 虚拟主机允许您在一台计算机上运行多个网站 使用虚拟主机 您可以指定站点文档根 包含网站文件的目录 为每个站点创建单独的安全策略 使用不同的 SSL 证书等等 本文介绍如何在 Debian 10 服务器上设置 Apache 虚拟
  • 配置 Apache 错误和访问日志

    Apache 是一个开源 跨平台的 HTTP 服务器 它具有许多强大的功能 可以通过各种模块进行扩展 管理时Apache对于 Web 服务器 您将执行的最常见的任务之一是检查日志文件 了解如何配置和读取日志在排除服务器或应用程序问题时非常有
  • 如何在 Ubuntu 20.04 上设置 SSH 密钥

    Secure Shell SSH 是一种用于在客户端和服务器之间创建安全连接的网络协议 通过 SSH 您可以在远程计算机上运行命令 创建隧道 转发端口等 SSH 支持多种身份验证机制 最常见的两种是基于密码和公钥的身份验证 使用公钥进行认证
  • 巴什赫里多克

    在编写 shell 脚本时 您可能会遇到需要将多行文本或代码块传递给交互式命令的情况 例如tee cat or sftp 在 Bash 和 Zsh 等其他 shell 中 Here 文档 Heredoc 是一种重定向类型 允许您将多行输入传
  • 如何在 Ubuntu 18.04 上安装 Xrdp 服务器(远程桌面)

    Xrdp 是 Microsoft 远程桌面协议 RDP 的开源实现 允许您以图形方式控制远程系统 使用 RDP 您可以登录到远程计算机并创建真实的桌面会话 就像登录到本地计算机一样 本教程介绍如何在 Ubuntu 18 04 上安装和配置
  • 如何在 CentOS 7 上安装和配置 GitLab

    GitLab 是一个基于网络的开源Git存储库管理器编写为Ruby包括 wiki 问题管理 代码审查 监控以及持续集成和部署 它使开发人员能够构建 部署和运行他们的应用程序 GitLab 提供三种不同版本 社区版 CE 企业版 EE 和 G
  • 如何在 Linux 中获取目录的大小

    使用列出目录内容时ls命令 您可能已经注意到目录的大小几乎总是 4096 字节 4 KB 这是磁盘上用于存储目录元信息的空间大小 而不是它包含的内容 您要用来获取目录的实际大小的命令是du 它是 磁盘使用情况 的缩写 获取目录的大小 The
  • Linux 中的 awk 命令及示例

    Awk 是一种通用脚本语言 专为高级文本处理而设计 它主要用作报告和分析工具 与大多数其他过程性编程语言不同 awk 是数据驱动的 这意味着您定义一组要针对输入文本执行的操作 它获取输入数据 对其进行转换 并将结果发送到标准输出 本文涵盖了
  • 如何在 Debian 9 上安装 Minecraft 服务器

    我的世界 是有史以来最受欢迎的游戏之一 这是一款关于建造各种结构并进行冒险的沙盒视频游戏 本教程介绍了如何在 Debian 9 上安装和配置 Minecraft 服务器 我们将使用 Systemd 来运行 Minecraft 服务器和mcr
  • 如何在 Ubuntu 18.04 上安装 Opera Web 浏览器

    Opera是世界上最流行的跨平台网络浏览器之一 它是专为现代网络构建的快速 易于使用且安全的浏览器 Opera 基于与Chrome并提供类似的浏览体验 并允许您从 Google 官方网上应用店安装 Chrome 扩展程序 它具有内置功能 例
  • 如何在 Vim / Vi 中显示行号

    Vim Vi 是许多软件开发人员和 L inux 系统管理员首选的文本编辑器 默认情况下 Vim 不显示行号 但可以轻松打开它们 Vim 支持三种行号模式 可帮助您浏览文件 除了标准的绝对行编号之外 Vim 还支持相对和混合行编号模式 本文
  • 如何在 CentOS 7 上安装 Webmin

    Webmin是一个用于 Linux UNIX 系统管理的开源 Web 控制面板 Webmin 允许您管理用户 组 磁盘配额以及配置最流行的服务 包括 Web FTP 电子邮件和数据库服务器 本教程介绍如何在 CentOS 7 服务器上安装
  • 如何在 Linux 中更改 SSH 端口

    默认情况下 SSH 侦听端口 22 更改默认 SSH 端口可以降低自动攻击的风险 从而为您的服务器增加了额外的安全层 本教程介绍如何更改 Linux 中的默认 SSH 端口 我们还将向您展示如何配置防火墙以允许访问新的 SSH 端口 保护服
  • 如何使用 SOCKS 隧道在没有 VPN 的情况下安全地路由 Web 流量

    作者选择了COVID 19 救济基金接受捐赠作为为捐款而写程序 介绍 在某些时候 您可能会发现自己所在的网络不安全或防火墙限制过于严格 并且您需要确保没有人在监视您的流量 一种解决方案是使用 VPN 但许多 VPN 需要在您的计算机上安装特
  • Java 集合 sort()

    今天我们将研究Java集合的排序方法 在与java中的集合 我们经常需要对数据进行排序 Java 集合 sort Java Collections类为我们提供了非常方便的方法Collections sort 对所有进行排序List实施例如链