Java 比较器 Arrays.sort()

2023-12-28

我想排序一个arrayJava中的二维数组根据一些规则,比如说距原点的距离。我看到了几种使用方法Arrays.sort():

1) Arrays.sort(points, Comparator.comparing(p -> p[0]*p[0] + p[1]*p[1]));

2) Arrays.sort(points, (p1, p2) -> p1[0]*p1[0] + p1[1]*p1[1] - p2[0]*p2[0] - p2[1]*p2[1]);

3)定义class:

class Point implements Comparable<Point>{
     // class variables, constructor
     public int compareTo(Point p) {
         return (x*x + y*y).compareTo(p.x*p.x + p.y*p.y);
     }
}

数组pts类型的Points然后创建并且Arrays.sort(pts)用来。我的问题是关于1) and 2):我看到了两者之间的区别,但我不明白何时使用其中一种,何时使用另一种,以及到底是什么Comparator.comparing()是在做。为什么第一个解决方案只携带一个点,而第二个解决方案需要两个点?


Comparator.comparing实现如下:

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
        Function<? super T, ? extends U> keyExtractor)
{
    Objects.requireNonNull(keyExtractor);
    return (Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

即它使用Function您传递给它以便将每个比较的元素转换为Comparable,然后使用Comparable's compareTo method.

当你传递函数时p -> p[0]*p[0] + p[1]*p[1],您将每个点转换为其平方和。然后,当Comparator需要比较两个点,它比较两个点的平方和,这几乎相当于计算两个点的平方和的差(这并不完全等价,因为通过计算它们的差来比较两个数字可以产生数字溢出时输出错误)。

这正是你的第二个Comparator - (p1, p2) -> p1[0]*p1[0] + p1[1]*p1[1] - p2[0]*p2[0] - p2[1]*p2[1] - does,

since p1[0]*p1[0] + p1[1]*p1[1] - p2[0]*p2[0] - p2[1]*p2[1] == (p1[0]*p1[0] + p1[1]*p1[1]) - (p2[0]*p2[0] + p2[1]*p2[1]).

Using Comparator.comparing()更安全,因为它比较两个点的平方和而不计算它们的差。它用Double's compareTo()相反(假设你的点的坐标是Double or double).

换句话说,第一个替代方案使用Function只需要一点,因为这个函数告诉Comprator.comparing如何变换这 2 个点中的每一个。

另一方面,第二种选择接受 2 点(这是Comparator.compare()方法)并确定这两个点的相对顺序。

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

Java 比较器 Arrays.sort() 的相关文章

  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 如何 grep 遍历数组,同时过滤掉匹配项?

    有没有一种快速简便的方法来 grep 遍历数组 找到满足某些测试的元素and从原始数组中删除这些 例如我想要 a 1 7 6 3 8 4 b grep filter gt 5 a now b 7 6 8 and a 1 3 4 换句话说 我
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 尝试在没有 GatewayIntent 的情况下访问消息内容

    我希望每当我写一条打招呼的消息时 机器人都会在控制台中响应一条消息 但它只是给我一个错误 JDA MainWS ReadThread WARN JDA Attempting to access message content without
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 与 array_intersect 相反?

    是否有一个内置函数可以获取数组 1 中不存在于数组 2 中的所有成员 我知道如何以编程方式执行此操作 只是想知道是否有一个内置函数可以执行相同的操作 所以请不要提供代码示例 这听起来像是一份工作array diff http www php
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • 多个新元素的角度交错动画

    我正在尝试在列表中添加交错动画 到目前为止 我已经成功地加载了交错动画 除了加载之外 我还希望在将新项目添加到数组时触发交错动画 我按照这个例子 https medium com google developer experts angul
  • InnoSetup:如何在组件描述中添加换行符

    我正在尝试在组件的描述中间添加换行符 但我似乎找不到合适的语法 Components Name Component A Description This is component A NewLine My component A has t
  • matlab函数sum()的奇怪行为

    知道为什么 Matlab 会这样吗 gt gt sum 0 0 0 Subscript indices must either be real positive integers or logicals gt gt sum 1 1 1 an
  • Xcode Interface Builder - 删除/重命名错误接线的 IBOutlets / IBActions 的“正确”方法?

    我是 Xcode 新手 使用 Swift 工作 所以我不确定我所描述的是否实际上是一个错误 使用界面生成器和助理编辑器时 我可以创建标签 按钮等 并通过按住 Control 键拖动在代码中创建 Outlet 和 Action 只要我是完美的
  • Drools:在数据库中存储规则

    目前 我将所有规则文件存储在文件系统上 它们有很多版本 并在启动时将它们的不同版本加载到内存中 我想更改为将我的 drools 文件存储在数据库中 并且想知道 Drools 是否有任何解决方案或插件可以促进这一点 或者我应该自己制作 Tha
  • 如何在没有 JavaScript 的情况下仅使用内联 CSS 创建工具提示?

    我正在尝试使用内联 CSS 创建悬停工具提示 而不使用 JavaScript 这是我现在的代码 a href hover text span style background color black color white span a
  • 以 JSON 形式提交表单(无 AJAX)

    是否可以在不使用 AJAX 的情况下以 JSON 形式提交表单数据 我尝试更改 enctype
  • Youtube API 返回当前时间

    我正在使用 youtube iframe api 似乎无法在文档或 google 上找到任何引用如何获取当前媒体完成时的返回值的内容 我需要构建一个脚本 可以在其中传递时间变量 其中当变量与当前播放时间匹配时可以触发事件 我知道在嵌入 AP
  • 如何在 R 中导出/导入向量?

    我意识到这是一个非常基本的问题 但我想确保我做得正确 所以我想问只是为了确认 我在一个项目中有一个向量 我希望能够在另一个项目中使用它 我想知道是否有一种简单的方法可以以一种可以轻松将其导入到另一个项目的形式导出该向量 到目前为止 我想出的
  • 从 jquery 通过 AJAX 发送图像数据

    我需要使用 AJAX 将图像数据 data image png base64 从客户端发送到我的 PHP 服务器 我的 AJAX 调用如下所示 表单数据包含图像 ajax url global siteurl save image data
  • 捆绑 git 存储库而不克隆它

    如何捆绑 git 项目而不需要每次都克隆它 现在我总是执行下面的命令 git clone mirror http git project cd git project git bundle create git project lock a
  • selectInput 值未在可反应的 Shiny 中更新(麻烦绑定-unbiding)

    我在 Shiny 的可反应内部有一个 selecInput 但输入没有更新 我想做这样的事情 但可以反应 绑定 取消绑定 DataTable 时出现反应问题 https stackoverflow com questions 3757203
  • 来自 AngularJS 的 Django CORS API

    我已经在 Django 中使用 django cors 启用了 CORS https github com ottoyiu django cors headers https github com ottoyiu django cors h
  • Numpy - 多个外积

    我想知道是否有一种方法可以计算多个外部产品并将结果堆叠在单个操作中 假设我有一个 Nx1 向量并与 1xM 向量进行外积 结果将是一个 NxM 矩阵 如果我有一个 NxR 矩阵 A 和一个 RxM 矩阵 B 会怎么样 是否可以构造一个 Nx
  • .NET 中的类数量?

    NET 中的类总数是多少 那个数字 位于下载的 NET 2 0 NET 3 0 和 NET 运行时中 3 5 SP1 我们正在写一篇关于应用程序的科学论文 基于 NET 目前声明还有更多 超过6000个班级 但我不确定这是否正确 数字 例如
  • Antlr 外部输入

    我有一个语法文件 BoardFile g4 其中包含 仅相关部分 grammar Board Tokens GADGET squareBumper circleBumper triangleBumper leftFlipper rightF
  • 如何为 UIWebView 设置自定义键盘

    如何为 iOS7 及更高版本的可编辑 UIWebView 显示自定义键盘和输入附件视图 即 我如何设置并使用其中的值 UIWebView setInputView and UIWebView setInputAccessoryView 了解
  • Google Contacts API - 获取访问令牌(oauth)后

    我设法获取谷歌联系人 API 的访问令牌 但是当我尝试调用以检索登录用户的个人资料时 我收到 401 未经授权的错误 我做了一些研究 并按照 各种 谷歌文档中提到的步骤进行操作 例如this one http code google com
  • gremlin-python 不是可用的 GremlinScriptEngine

    我正在尝试使用 gremlin python 在 AWS neptune 上执行 lambda 函数 它击中了我gremlin python is not an available GremlinScriptEngine 有人可以帮忙解决这
  • Java 比较器 Arrays.sort()

    我想排序一个arrayJava中的二维数组根据一些规则 比如说距原点的距离 我看到了几种使用方法Arrays sort 1 Arrays sort points Comparator comparing p gt p 0 p 0 p 1 p