Java TreeSet 与长度比较器错误?

2023-11-25

我有下面的代码,它使用基于字符串长度的比较器创建一个 TreeSet。

public class TreeSetComparator {
    public static void main(String[] args) {
        SortedSet<String> sortedSet = new TreeSet<>(Comparator.comparing(String::length));
        sortedSet.addAll(Arrays.asList("aa", "bb", "aa"));
        System.out.println(sortedSet);
    }
}

令我惊讶的是上面的输出是

[aa]

虽然我期望

[aa, bb]

or

[bb, aa]

“bb”部分消失了,这似乎违反了 SortedSet 契约。比较器应该只对元素进行排序,而不确定它们的唯一性,这通常由 equals 确定。

另一方面,如果我增强比较器以始终为如下所示的不相等项返回非零,只有这样我才能得到正确的结果。

    SortedSet<String> sortedSet = new TreeSet<>(Comparator.comparing(String::length).reversed().thenComparing(String::toString));
    sortedSet.addAll(Arrays.asList("aa", "bb", "aa"));
    System.out.println(sortedSet);

现在的输出是[aa, bb]正如我所期望的。

以上是 TreeSet 实现中的错误吗?

我的环境如下:

mvn --version                                                                                                                                            21:40:22
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T19:33:14+01:00)
Maven home: /home/aaaa/.sdkman/candidates/maven/current
Java version: 10.0.2, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-10-jdk
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.14.60-1-manjaro", arch: "amd64", family: "unix"

UPDATE

以下是相关帖子以及有关如何在未来版本的 Java 中解决该问题的建议:https://yesday.github.io/blog/2018/java-gotchas-sorted-set-ignores-the-equals-method.html


这不是一个错误。至少不在TreeSet.

从javadoc中,我强调:

请注意,集合维护的顺序(无论是否是显式的) 提供比较器)必须是与等于一致如果是为了 正确实现Set接口。 (参见可比较或比较器 与 equals 一致的精确定义。) 就是这样 因为 Set 接口是根据 equals 操作定义的, 但TreeSet 实例使用其执行所有元素比较 CompareTo(或比较)方法,因此两个元素被视为相等 通过这种方法,从集合的角度来看,相等。这 即使集合的顺序不一致,集合的行为也是明确定义的 与平等;它只是没有遵守 Set 的一般契约 界面。

因为“aa”和“bb”的长度都是 2,所以它们被认为相等compareTo从而由TreeSet.

根据定义, 与等于一致 means:

比较器 c 对一组元素 S 施加的排序被称为与等于一致当且仅当对于 S 中的每个 e1 和 e2,c.compare(e1, e2)==0 与 e1.equals(e2) 具有相同的布尔值。

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

Java TreeSet 与长度比较器错误? 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 如何从秘密字符串中制作 HMAC_SHA256 密钥以在 jose4j 中与 JWT 一起使用?

    我想生成 JWT 并使用 HMAC SHA256 对其进行签名 对于该任务我必须使用jose4j https bitbucket org b c jose4j wiki Home 我尝试根据秘密生成密钥 SecretKeySpec key
  • 为什么 java 编译器不报告 Intellij 中多播表达式的未经检查的强制转换警告?

    为什么下面的代码没有报告 Intellij IDEA 的未经检查的警告jdk 1 8 0 121自从Supplier
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop

随机推荐

  • 法拉第超时错误与omniauth(自定义策略)/门卫

    我目前正在关注这个铁路广播公司对于我的具体情况 我在omniauth的回调中遇到了法拉第超时错误 目前 我使用 Rails 应用程序作为 API 并使用骨干网作为 javascript 前端 在同一应用程序上 我决定使用 OAuth 锁定
  • 将 AngularJS html5mode 与 NodeJS 和 Express 结合使用

    我正在使用带有 Express 的 NodeJS 服务器来为我的 AngularJS 应用程序提供服务 当我使用 angularJS 默认路由 hashbangs 时 这一切都工作正常 但现在我正在尝试激活 html5 模式 我正在像这样激
  • Git 修改/重写(不添加/更改文件)

    我经常想编辑提交消息 而不必从上次提交中重新选择文件集 git commit file1 c file2 c 提交消息中的意外拼写错误 git commit file1 c file2 c amend 这可行 但我不想从原始提交中重新选择文
  • 让 cmake 和 home-brew 一起工作

    当我用自制程序 cmake 安装库时似乎找不到它们 对于使用brew安装的任意库 有没有一种简单的方法可以解决这个问题 Default 默认情况下 brew 的库安装到 usr local lib folder gt ls usr loca
  • 启动线程的不同方式有什么区别?

    我有一个名为MyThread它扩展了Thread类并实现了run 函数 当我想运行它时 我有两种方法 新建一个实例并调用该函数 例如 new MyThread start new一个实例并将该实例作为参数传递给Thread的构造函数 然后调
  • Fxxx私有类名前缀约定从何而来?

    在 C C 中 私有类变量的常见约定是m MyPrivateVar 并且我相信 m 代表 我的 我可能是错的 在 Delphi 中 私有类变量以F 例如F手柄等 F 是什么意思 福 有一些命名约定 以免在代码中迷失 这是一个例子来指出为什么
  • 创建独立的 Shiny 应用程序 - Chrome 错误

    我正在尝试按照这篇非常好的博客文章的说明创建一个闪亮的桌面应用程序 http www r bloggers com deploying desktop apps with r 所以基本上我有一个具有以下结构的文件夹 App GoogleCh
  • 如何使用动态 LINQ 求和

    我有以下内容 可以与动态 linq 库 string where Price lt 5 string orderby BookID ASC IQueryable
  • 会话的最佳实践(大猩猩/会话)

    在开始在 golang 中使用会话之前 我需要回答一些问题 会话示例 import github com gorilla sessions var store sessions NewCookieStore byte 33446a9dcf9
  • Android Volley 给我一个 outOfMemory 异常

    我正在使用 volley 从服务器的水平滑动视图中显示图像 但我的图像非常大 这就是我遇到内存不足的异常 下面是我的排球课 public class Volley private RequestQueue mRequestQueue pri
  • RStudio 未检测到 Rtools

    我正在使用最新的 R RStudio 和 Rtools 我已经更新了环境变量 现在我可以从命令行调用 gcc 或 R 当我尝试从 RStudio 发布应用程序时 出现以下错误 准备部署应用程序 完成正在上传捆绑包 应用程序 64015 错误
  • 使用 xmlstarlet 或 xmllint 获取属性值

    自过去两天以来 我已经解决了几个问题 但尚未找到解决方案 这是我的 xml
  • 如何在谷歌colab上安装pydot和graphviz?

    我正在尝试在谷歌合作实验室上绘制我的模型 from keras utils import plot model plot model model to file model png 我得到了这个错误 ImportError Failed t
  • 从非管理应用程序以管理员身份运行进程

    从不以管理员身份运行的应用程序中 我有以下代码 ProcessStartInfo proc new ProcessStartInfo proc WindowStyle ProcessWindowStyle Normal proc FileN
  • AJAX 文件上传后 $_POST 和 $_FILES 为空

    我是网络开发新手 最近遇到的问题是ajax文件上传 现在我有两个 HTML 输入字段 文件输入和按钮
  • 使用 JDBC 从长字符串创建 CLOB

    我有以下查询 select id from table1 where some func 1 where some func是一个允许其参数为 VARCHAR2 或 CLOB 的函数 并且 是一些字符串 可能很长 我正在尝试使用以下代码来绑
  • 仅在 dart/flutter 中取小数

    我有一个数字 我想只取小数部分并将其转换为具有一定精度的整数 我怎样才能用 Dart 语言或 flutter 做到这一点 例如 转动这个 247 64646122587197 进入这个 6464 去掉浮点数 只取4位小数 将其转换为整数 像
  • 动态更新 NSTouchBar 以编程方式添加/删除项目

    我目前正在为我的 macOS 应用程序实现 NSTouchBar api 目前 我唯一的触摸栏将主视图控制器作为其委托 我可以向其中添加项目 问题是 我需要仅在满足特定条件 在表中选择一行 时才显示其中一些项目 假设我有一个布尔值 指示按钮
  • Mac 上是否预装了 freetype?

    我对 Mac OS X 环境比较陌生 我试图安装 freetype 库来在 OpenGL 中显示文本 但失败了 我在一些论坛上读到 Mac OS X mountain lion 预装了 freetype 我只是想确认这一点 如果 Mac 确
  • Java TreeSet 与长度比较器错误?

    我有下面的代码 它使用基于字符串长度的比较器创建一个 TreeSet public class TreeSetComparator public static void main String args SortedSet