我想用otherMap检查origMap的键。如果找到,则将othermap的值作为键,将origMap的值作为值
将其放入新的哈希图中。如果未找到,则在同一地图中使用Bigdecimal位置作为键“ other”来计算origmap的所有值,并将值作为bigdecimal输出。我正在尝试像下面,但它不工作抛出空指针,不确定是什么问题。
地图:
HashMap < String, Object > origMap = new HashMap < String, Object > ();
origMap.put("test", "1");
origMap.put("test2", "100.00");
origMap.put("test3", "3");
origMap.put("test4", "300.23");
HashMap < String, Object > otherMap = new HashMap < String, Object > ();
otherMap.put("test3", "fee");
otherMap.put("test2", "tax");
码:
Map newMap = new HashMap();
BigDecimal value1 = null;
for (Map.Entry <? , ?> me: origMap.entrySet())
{
String key = "";
String value = "";
if (otherMap.get(key).equals(me.getKey()))
{
key = otherMap.get(me.getKey()).toString();
value = origMap.get(me.getKey()).toString();
newMap.put(key, value);
}
else
{
value = origMap.get(me.getKey()).toString();
value1 = value1.add(new BigDecimal(value));
}
queryMap.put("others", value1);
}
最佳答案
otherMap.get(key)
找不到key=""
的条目,因此对equals(...)
的调用将引发NPE。
由于您似乎尝试检查me.getKey()
中是否有otherMap
的条目,因此请尝试使用otherMap.get(me.getKey()) != null
或otherMap.containsKey(me.getKey()=)
。
另外,otherMap.get(key).equals(me.getKey())
在您的情况下永远不会为真(与key
的值无关),因为您正在将otherMap
的值与origMap
的键进行比较。
另外请注意,除非确定没有空值,否则调用toString()
也可能会导致NPE。
我将尝试将您的代码重组为我想要的代码:
Map<String, String> newMap=new HashMap<>(); //as of Java 7
BigDecimal value1=null;
for (Map.Entry<String,Object> me : origMap.entrySet()) {
if(otherMap.containsKey( me.getKey() )) {
Object otherValue = otherMap.get(me.getKey());
Object origValue = origMap.get(me.getKey());
String key = otherValue != null ? otherValue.toString() : null; //note: this might cause problems if null keys are not allowed
String value = origValue != null ? origValue.toString() : null;
newMap.put(key, value);
}else {
Object origValue = origMap.get(me.getKey());
if( origValue != null ) {
value1=value1.add(new BigDecimal( origValue.toString())); //note: this might cause NumberFormatException etc. if the value does not represent a parseable number
}
}
queryMap.put("others", value1);
}
顺便说一句,如果所有值都是字符串,为什么
origMap
和otherMap
类型为Map<String, Object>
?在那种情况下,Map<String, String>
会更合适,从而消除了toString()
调用的需要(以及null检查)。