0

origMap のキーを otherMap でチェックしたい。

新しいハッシュマップに配置します。見つからない場合は、Bigdecimal を使用して origmap のすべての値を計算し、キー "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);
}
4

1 に答える 1

1

otherMap.get(key)のエントリが見つからないため、 へkey=""の呼び出しequals(...)で NPE がスローされます。

me.getKey()in otherMaptry otherMap.get(me.getKey()) != nullor otherMap.containsKey(me.getKey()=)insteadのエントリがあるかどうかを確認しようとしているようですので。

さらに、値 fromをキー from と比較しているため、otherMap.get(key).equals(me.getKey())( の値に関係なく) が true になることはありません。keyotherMaporigMap

toString()また、null 値がないことが確実でない限り、呼び出すと 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ですか? その場合、より適切に適合するため、呼び出しの必要がなくなります (および null チェックも同様です)。otherMapMap<String, Object>Map<String, String>toString()

于 2013-08-22T11:09:18.503 に答える