Sooooo,我遇到HashMap<String, String>
的问题。我知道密钥存在于地图中,我在地图中看到了密钥但由于某种原因我无法匹配密钥。当我将值插入地图时,我修剪()它以摆脱任何空格字符。
当我在运行时检查地图时,我看到:{N * = N414} 然后我用一些测试代码检查了它:
String entityFromMap="N*";
for ( String key : entityMap.keySet() ) {
System.out.println("["+key+"]");
}
for ( String key : entityMap.keySet() ) {
System.out.println("["+key.equals("N*")+"]");
}
System.out.println(entityMap.keySet().contains("N*"));
System.out.println(entityMap.keySet().contains(entityFromMap));
System.out.println(entityMap.containsKey("N*"));
System.out.println(entityMap.containsKey(entityFromMap));
我得到了这个输出:
[N*]
[true]
false
false
false
false
当我尝试获取与N *键相对应的值时
return (String) entityMap.get(entityFromMap);
我得到了空。
我在这里缺少什么?这是我试图从地图中获取密钥的方式吗?我的直觉告诉我,在钥匙上有一个*有问题,比较款待是正则表达式还是什么?当我输入我的字符串时,还有其他东西可以检查吗?除了trim()?
我试着查看其他帖子,但大多数都是通过检查空格字符解决它,我很肯定这里没有,所以我不知道下一步该做什么。我发现这篇文章:link但我不确定这是同一个问题....
编辑: 这是填充地图的方式:
codeMap.put(ResultSet.getString(1).trim(), ResultSet.getString(2).trim());
答案 0 :(得分:1)
HashMap
根据equals()
和hashCode()
查找值。您可以轻松打印并比较哈希码:
System.out.println("N*".hashCode());
for (String key : entityMap.keySet()) {
System.out.println(key.hashCode());
}
如果他们是平等的,我会断定你没有标准的HashMap
,而是基于对象身份的其他一些地图实现,比如IdentityHashMap。如果它们不相等,那么编码将成为问题:明星e。 G。可能是U + 2217“*”而不是“*”。某些字体会将它们映射到相同的字符。
同时检查调试器中的值。
答案 1 :(得分:0)
正则表达不用于比较密钥,它与此无关。
当您在寻找密钥时,请不要忘记key.trim()
,它不会去任何地方。
这与你的地图或它对待字符串的方式无关,你可能会混淆一些东西,因为我确实运行了你的代码:
import java.util.*;
public class HelloWorld {
public static void main(String []args) {
HashMap<String,String> entityMap = new HashMap<String, String>();
entityMap.put("N*", "data"); //you can put null instead of data
String entityFromMap = "N*";
for (String key : entityMap.keySet()) {
System.out.println("["+key+"]");
}
for (String key : entityMap.keySet()) {
System.out.println("["+key.equals("N*")+"]");
}
System.out.println(entityMap.keySet().contains("N*"));
System.out.println(entityMap.keySet().contains(entityFromMap));
System.out.println(entityMap.containsKey("N*"));
System.out.println(entityMap.containsKey(entityFromMap));
}
}
输出:
[N *]
[真]
真正
真正
真正
真