java - Java hashmap 找不到现有条目
问题描述
我遇到了一个非常奇怪的问题:我编写了一个 CSV 解析器,它将第一行作为标题读取,然后创建一个映射,其中键是标题,值是后续行中的值。
如您所见,“abc”在 HashMap 条目 #23 内,但是当我检索它时,它会显示为 null。
我认为这与我的 CSV 文件有关,但为什么映射条目在调试器上正确显示但无法检索?
我的 CSV 文件如下所示:
abc,数据源,实体,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 ,23,24 NA,source1,entity1,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124
解决方案
您观察到的调试器结果的唯一合理解释是第一列标题实际上不是"abc"
. 它可能包含一个或多个附加的非打印字符。当然,这些不会打印在调试器的映射内容列表中,但它们仍然存在,因此"abc"
映射中确实不存在密钥。它实际上是类似的"<some_non-printing_character>abc"
。或者,可能是您的显示器上呈现相同的不同字符。无论哪种方式,使用十六进制编辑器检查输入文件以查看真相。
有问题的列是第一列,一个额外字符的可能候选者是 Unicode BOM,U+FEFF,作为文件的第一个字符出现。一些文本编辑器会插入这样一个字符作为幻数,将文件标记为以 UTF-8 编码,尽管实际上 UTF-8 并不要求这样做,并且除了自身之外,对这样的字符没有任何意义。
推荐阅读
- spring - 在 Kotlin 流中使用 ReactiveSecurityContextHolder
- python - 仅在一个方向上使用膨胀?
- regex - 查找路径中的最后一个单词并使用 bash 使用正则表达式删除括号
- python-3.x - 如何让 Sphinx-autoapi 从源代码中显示自定义注释
- angular - 将 2 个接口相互映射(包含示例以供理解)
- node.js - 将两个侦听器附加到单个 axios 流
- google-maps - 在选择马德里或巴塞罗那等城市时,我遇到了地点问题
- c# - 通过命令提示符运行表单应用程序并向其发送命令
- javascript - 在 if 语句中将它们设置为变量后无法调用函数 - Javascript?
- google-maps - 状态栏下的 Xamarin.Forms 应用程序(显示抠图)