当前位置: 首页 > 面试题库 >

Java TreeMap重复键

娄浩荡
2023-03-14
问题内容

我想我可能已经发现Java错误。

我有一个TreeMap,其中使用了自定义比较器。但是,似乎当我将(key,value)放在已经存在的键上时,它不会覆盖该键,从而创建了重复的键。我想我已经验证了这一点,因为我尝试过

System.out.println(testMap.firstKey().equals(testMap.lastKey()));

这打印出真实的。有人知道为什么会这样吗?

这是比较器代码:

private class TestComp implements Comparator<String> {
    @Override
    public int compare(String s1, String s2){

        if (s1.equals(s2)) {
            return 0;
        }
        int temp = otherMap.get(s1).compareTo(otherMap.get(s2));
        if (temp > 0) {
            return 1;
        }
        return -1;

    }

问题答案:

比较器始终需要返回一致的结果,并且在TreeMap中使用时,应与equals保持一致。

在这种情况下,您的比较器违反了第一个约束,因为它不一定会给出一致的结果。

示例: 如果例如otherMap地图

"a" -> "someString"
"b" -> "someString"

那么这两个compare("a", "b")compare("b", "a")返回-1

请注意,如果您将实现更改为

if (s1.equals(s2)) {
    return 0;
}
return otherMap.get(s1).compareTo(otherMap.get(s2));

您违反了与equals保持一致的其他条件,因为即使不等于otherMap.get(s1).compareTo(otherMap.get(s2))也可能返回。0``s1``s2

从评论:

即使比较器的结果不一致,Java语言是否也不应该允许重复的键?

不,当您插入密钥时,TreeMap将使用比较器搜索数据结构以查看密钥是否已存在。如果比较器给出的结果不一致,则TreeMap可能 会在错误的位置查找
并得出该键不存在的结论,从而导致不确定的行为。



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE” (11个答案) 6年前关闭。 我正在尝试完成此查询;我的标签字段设置为UNIQUE,我只是希望数据库忽略任何重复的标签。 甚至可以接受 问题答案: 建议不要使用INSERT IGNORE,因为它会忽略所有错误(即,草率的全局忽略)。相反,由于在您的示例中

  • 简介 本章中我会介绍重复。通过重复,你可以编写“通常的”程序。虽然也可以使用do表达式,但Scheme中通常通过递归实现重复。 递归 在自己的定义中调用自己的函数叫做递归函数(Recursive Function)。虽然这听起来很奇怪,但是循环的常见方法。如果你把函数类比为机器的话,递归似乎毫无道理。然而,正因为函数是过程,函数调用自己是有意义的。比如说,让我们来考察一下文献调研吧。你可能需要去阅

  • 下面是Gradle Build的stacktrace: Build.Gradle看起来是这样的: 编辑1:从META-INF目录中的httpmime库的本地副本中删除我有问题的文件,成功解决了此问题

  • 问题内容: 我在存储的过程中有一个字符串,类似于或 从上面的字符串中,我必须从中删除多个逗号,它必须看起来像 或仅在 then时 。我必须仅使用Sql Server函数。我正在使用Sql Server 2008和.Net 3.5 提前致谢。 问题答案: 该选项适用于仅使用逗号或最多398个连续逗号的字符串。 如果需要更多,在顶部添加额外的2的幂,或者如果需要较少,则从顶部删除2的幂。每个阶段的注释

  • 我有一个这样的数据帧。 现在,我想将第1列中的dict扩展到如下所示的各个列。 有没有捷径可以实现这一点?

  • 我开发了一个从REST API获取访问令牌的简单类。它还没有完全实现,但它的想法是将令牌持久化到数据库中。我还有一个函数来检查是否有任何可用的令牌,如果没有,它就调用获取新令牌的函数。我还开发了一个单元测试来检查我是否获得了令牌。 我在运行测试时遇到了一个问题,NoSuchBeanDefinitionException问题。我不知道我做错了什么。我对Spring boot还很陌生,所以感谢所有的帮

  • 为什么会出现这种错误?我正在使用freemarker-2.3.20和spring-webmvc-3.2.17

  • 问题内容: java.util.Collections.max的签名如下所示: 公共静态<T扩展对象和可比较<?超级T >> T max(Collection collection); 据我了解,它基本上意味着T必须既是 java.lang.Object又是java.lang.Comparable <?超级T >> , 但是,由于每个java.lang.Comparable也是java.lang.