java HashMap密钥与低吞吐量的比较

时间:2013-08-22 11:05:13

标签: java hashmap

我想用otherMap检查origMap的键。如果找到其他map的值作为键的值,则将origMap的值作为值

将其放入新的hashmap中。如果没有找到,则在相同的地图中使用Bigdecimal地点计算orig的所有值,作为键“other”,并将值计算为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);
}

1 个答案:

答案 0 :(得分:1)

otherMap.get(key)找不到key=""的条目,因此对equals(...)的调用会抛出NPE。

由于您似乎尝试在me.getKey()尝试otherMapotherMap.get(me.getKey()) != null中检查otherMap.containsKey(me.getKey()=)是否有条目。

此外,otherMap.get(key).equals(me.getKey())在您的情况下永远不会成立(与key的值无关),因为您将otherMap的值与来自{{1}的键进行比较}}

另请注意,调用origMap也可能会导致NPE,除非您确定没有空值。

我会尝试将您的代码重构为我认为您想要的内容:

toString()

顺便说一句,如果所有值都是字符串,为什么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>调用(以及空检查)。