2016-12-07 5 views
0

に地図からユニークなアイテムの合計を取得します。私は現在、次の情報を格納するマップを持っているのjava

Map<String,String> animals= new HashMap<String,String>(); 
animals.put("cat","50"); 
animals.put("bat","38"); 
animals.put("dog","19"); 
animals.put("cat","31"); 
animals.put("cat","34"); 
animals.put("bat","1"); 
animals.put("dog","34"); 
animals.put("cat","55"); 

私は上記のマップでユニークなアイテムの合計で新しいマップを作成したいです。したがって、上記のサンプルでは、​​catのカウントは170、batのカウントは39となります。

私は、しかし、私は、それぞれ一意のエントリ

+3

あなたは現在、1つの "猫"と1つの "犬"を持つ地図を持っています。 'HashMap'は重複キーを許可しません。 – Guy

+0

@Guyが言ったことをさらに説明すると、マップに 'put'を使用するたびにキーがすでに存在していた場合、そのキーのマップにある値が' put'で置き換えられます。マップの全ポイントは、キーが一意であり、キーだけを使用してデータを表示できることです。 – RealSkeptic

+0

私は動物の地図を印刷しようとしました、@ GuyとRealSkepticが何を言っているかを見てみました。それが動作するかどうかを確認するためにdimo414のソリューションを試してみましょう – BountyHunter

答えて

1

まずの合計数を取得することができません使用して、算術演算のためのStringを使用していない、マップ内のユニークな動物エントリを見つけるために、設定を使用して試してみましたintまたはdouble (またはBigInteger/BigDecimalですが、これはおそらくここでは過剰です)。あなたの地図をMap<String, Integer>にすることをお勧めします。与えられたキーがすでにマップ内に存在している場合@Guyのみ{cat:55, dog:34, bat:1}が含まれている実際にあなたのマップを指摘するように、第2

Map.put()、以前の値が上書きされます。あなたはそれを保存するために何とか以前の値を取得する必要があります。

古典的な方法は、(前のJava-8)はそうのようなものです:

public static void putOrUpdate(Map<String, Integer> map, String key, int value) { 
    Integer previous = map.get(key); 
    if (previous != null) { 
    map.put(key, previous + value); 
    } else { 
    map.put(key, value); 
    } 
} 

のJava 8は-または - プットしMap.merge()のように、このパターンやすくするためにMapに有用な方法の番号を追加しますあなたのためのアップデート:

map.merge(key, value, (p, v) -> p + v); 

ます。またmultisetが、それはあなたのためのデクリメント/インクリメントハンドルとして使用するために、より良いデータ構造であることがあります。グアバはa nice implementationを提供します。

0

Guyが言いました。今あなたはバット1匹、犬1匹、猫1匹あります。別の 'put'はあなたの過去の値を無効にします。定義のために。マップには、マップ内の各キーが一意のキーと値のペアが格納されます。あなたがマップでそれを行う必要がある場合は、それをちょうど合算することができます。あなたは猫のために別の値を追加すると、あなたはそれを更新したい場合たとえば、あなたは、このような方法でそれを行うことができます:猫のための

animals.put("cat", animals.get("cat") + yourNewValue); 

あなたの値が更新されます。これは、例えば、私たちの数値が浮動小数点数/整数/長さであり、文字列ではない場合です。文字列で行う必要がある場合は、この場合に使用できます。

animals.put("cat", Integer.toString(Integer.parseInt(animals.get("cat")) + yourNewValue)); 

しかし、それは醜いです。私は作成をお勧めします

Map<String, Integer> animals = new HashMap<String, Integer>(); 
関連する問題