TreeMap 中的键返回 null

2023-12-31

所以我有一个非常奇怪的错误。当我最初使用 keySet() 迭代大型 TreeMap 的前 10 个键时,我偶然发现了它。其中一个键返回 null,据我的理解,这应该是不可能的。所以我写了下面的测试代码:

int i = 0;
        for (Map.Entry<String, Integer> es : sortedMap.entrySet()){
            if (i >= 10) {
                break;
            }

            if (sortedMap.containsKey(es.getKey())){
                System.out.println(es.getKey() + ":" + sortedMap.get(es.getKey()));
            } else {
                System.out.println("Key " + es.getKey() + " does not exist, yet...");
                System.out.println("This does work: " + es.getKey() + ":" + es.getValue());
                System.out.println("This does NOT work: " + es.getKey() + ":" + sortedMap.get(es.getKey()));
            }
            i++;
        }

并得到如下结果:

SOAP:967
'excerpt'::679
'type'::679
Key 'author_url': does not exist, yet...
This does work: 'author_url'::679
This does NOT work: 'author_url'::null
'date'::679
Android:437
TLS:295
message:283
server:230
monthly:215
<<<<<<<<<<<<<<<<<<<<DUMPING MAP!
{SOAP=967, 'excerpt':=679, 'type':=679, 'author_url':=679, 'date':=679, Android=437, TLS=295, message=283, server=230, monthly=215...

我在前十名之后切断了地图,因为那里还有很多东西,但所有这些都是带有值的键。

所以我的问题是这样的:为什么当我使用key直接从TreeMap中get(key)时得到null,但是EntrySet返回正确的key和value?

这是我的比较器,因为我是按整数订购的:

class ValueComparator implements Comparator<Object> {

  Map<String, Integer> base;
  public ValueComparator(Map<String, Integer> base) {
      this.base = base;
  }

  public int compare(Object a, Object b) {

    if ((Integer) base.get(a) < (Integer) base.get(b)) {
      return 1;
    } else if ((Integer) base.get(a) == (Integer) base.get(b)) {
      return 0;
    } else {
      return -1;
    }
  }
}

TreeMap 的构建如下:

ValueComparator bvc =  new ValueComparator(allMatches);
TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(bvc);
//Sort the HashMap
sortedMap.putAll(allMatches);

其中 allMatches 是HashMap<String, Integer>


从迭代的顺序来看,你的TreeMap显示,这绝对是您使用自定义的情况Comparator。 [否则迭代将按字典顺序排列]

请注意,根据javadocs http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html#compare%28java.lang.Object,%20java.lang.Object%29:

实现者必须确保 sgn(compare(x, y)) == -sgn(compare(y, x)) 对于所有 x 和 y。 (这意味着compare(x, y)必须抛出一个 当且仅当 Compare(y, x) 抛出异常时才异常。)

实现者还必须确保关系是可传递的: ((compare(x, y)>0) && (compare(y, z)>0)) 意味着compare(x, z)>0。

最后,实现者必须确保 Compare(x, y)==0 意味着 对于所有 z 来说 sgn(compare(x, z))==sgn(compare(y, z)) 。

If your Comparator不应用这些规则 - 行为未定义,因为可能会显示奇怪的结果 - 如您所见。

EDIT:[作为对编辑问题的答复]
您的比较器使用身份[operator==] 检查两个整数。
注意Integer是一个对象 - 因此operator==将返回true仅当它是同一个对象时。
你应该使用equals() http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#equals%28java.lang.Object%29检查两个整数是否相同 - 或者甚至更好 - 使用Integer.compareTo() http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#compareTo%28java.lang.Integer%29

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

TreeMap 中的键返回 null 的相关文章

  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 虽然我的类已加载,但 Class.forName 抛出 ClassNotFoundException

    代码如下 它的作用是加载我放在主目录中的 jar 文件中的所有类 import java io File import java util jar JarFile import java util jar JarEntry import j
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • Spring Data JPA:查询如何返回非实体对象或对象列表?

    我在我的项目中使用 Spring Data JPA 我正在演奏数百万张唱片 我有一个要求 我必须获取各种表的数据并构建一个对象 然后将其绘制在 UI 上 现在如何实现我的 Spring 数据存储库 我读到它可以通过命名本机查询来实现 如果指
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 在liferay搜索容器中显示来自自定义查询(连接表)的数据

    我已关注这个维基 http www liferay com community wiki wiki Main Custom queries in Liferay 5 2并已成功构建自定义查询 效果很好 我在表之间使用了联接 我的问题是如何使
  • OpenCV TypeError:参数 'src' 需要 cv::UMat - 这是什么?

    免责声明 巨大的 openCV 菜鸟 回溯 最近一次调用最后一次 文件 lanes2 py 第 22 行 位于 canny canny lane image 文件 lanes2 py 第 5 行 canny 中 gray cv2 cvtCo
  • JavaScript 闭包位于哪里?

    我编写这段代码是为了自学 JavaScript 闭包 function1 function var variable foo var function2 function argument console log variable argu
  • IE 中的光标/插入符通过覆盖层渗出

    我正在现有网站 www shopthethirdfloor com 上工作 使用 IE 如果您单击产品菜单 将焦点移至搜索框 然后在弹出的菜单覆盖层下滚动搜索字段 搜索字段将进入覆盖层下方 但光标在隐藏输入字段的位置继续闪烁是 这只发生在
  • 如何将 UITextField 中的文本获取到 NSString 中?

    我尝试了各种方法 但都给了我警告 例如userName NSString stringWithFormat yournamefield stringValue 这只是给了我一个警告 UITextField 可能无法响应 stringValu
  • 有没有一些优雅的方法来暂停和恢复任何其他 goroutine?

    就我而言 我有数千个 goroutine 同时工作work 我也有一个sync 协程 什么时候sync启动后 我需要任何其他 goroutine 在同步作业完成后暂停一段时间 这是我的代码 var channels chan int var
  • Android Compose-Navigation 2.4.0-alpha2 因 NoSuchMethodError 崩溃

    更新撰写导航依赖项的版本后 我的应用程序在启动时直接崩溃 并出现以下异常 java lang NoSuchMethodError No static method drawRect w2WG Gw default Landroidx com
  • 从 php 脚本制作可点击的文本

    我下面有一个 php 脚本 这会产生以下输出 美联社活动报道 Configure Maintain Service Configure Monitor SNC Configure Monitor Service Report ON SNC
  • 如何更改禁用的 ttk 按钮的前景色?

    当我禁用按钮时 颜色自动变为黑色 这是代码 from tkinter import from tkinter import ttk root Tk style ttk Style style configure TButton foregr
  • 如何组织 ASP.NET app_code 文件夹? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Typescript 中定义泛型函数类型;两种类似的方式?

    我正在尝试在 Typescript 中定义一些通用函数类型 似乎有两种类似的方法可以做到这一点 而且它们都有效 然而第二种形式 见下文ConcatY 似乎不那么灵活 或者至少我不知道如何指示函数采用具有特定参数类型的其中之一 有没有办法定义
  • 使用 Mocha 和 Istanbul 时从覆盖范围中排除文件

    使用 mocha 和 instanbul 时 如何从覆盖率报告中排除文件夹和文件 按路径 我想通过配置排除而不是 istanbul ignore next 在每个文件中 Jenkins使用生成的报告 Thanks 您可以使用以下命令忽略与特
  • 异步显示对话框

    我正在使用 async await 从数据库异步加载数据 在加载过程中 我想弹出一个加载表单 它只是一个简单的表单 带有运行进度条以指示有一个正在运行的进程 加载数据后 该对话框将自动关闭 我怎样才能做到这一点 下面是我当前的代码 prot
  • 如何在 Lumen 中使用身份验证进行用户登录?为什么我在启动时看到“未经授权”?

    我有一个无法加载 显示的登录页面 用户名 密码输入 相反 启动应用程序时 显示的只是 未经授权 这是来自命令Authenticate php我已将其进一步包含在下面 My routes php app gt get PageControll
  • 获取前台应用程序图标转换为base64

    我正在尝试获取前台应用程序图标并将其转换为 base64 我可以获取前台应用程序的名称 但无法获取图标 当我对其进行编码时 我得到一个字符串 但它不是图标 我不确定我的错误在哪里 这是我的代码 public class RunningSer
  • 在 WCF REST 序列化之前将 System.IO.Stream 转换为数据传输对象?

    这个问题建立在之前的问题的基础上 尽管偏离主题 我昨天问过 https stackoverflow com questions 4889439 getting a type specific response from a wcf rest
  • postgresql中的round函数究竟是如何工作的?

    postgresql中的round函数实际上是如何工作的 下面的查询展示了奇怪的行为 SQL DEMO http rextester com IHQ94614 select val Round x val NUMERIC as NUMERI
  • 带有文件 I/O 和数组列表的 JTable

    在我的程序中 用户输入单词及其相应的定义 该用户定义对象的一个 示例是 面容 人脸 用户的单词存储在一个与文件 I O 一起使用的数组列表中 但是 每次我调用 prepareTable 方法时 程序 将文本文件中找到的单词的重复项添加到数组
  • URL 的正则表达式

    下面发布的正则表达式用于获取 URL 包括以下格式的 URL example com 但是 我希望它只获取具有www or http https等在前面 换句话说 它应该拾起www example com 它不应该拾取example com
  • TreeMap 中的键返回 null

    所以我有一个非常奇怪的错误 当我最初使用 keySet 迭代大型 TreeMap 的前 10 个键时 我偶然发现了它 其中一个键返回 null 据我的理解 这应该是不可能的 所以我写了下面的测试代码 int i 0 for Map Entr