我想用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()) != nullotherMap.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);
}


顺便说一句,如果所有值都是字符串,为什么origMapotherMap类型为Map<String, Object>?在那种情况下,Map<String, String>会更合适,从而消除了toString()调用的需要(以及null检查)。

10-05 21:29