2016-04-11 355 views
1

ハッシュマップに同じキーを持つすべての値を追加する必要があるという問題があります。データ(ペットショップとペットの価格)はArrayListから取得されます。現時点では、同じ名前のペット価格が異なる複数のショップがあるため、プログラムは各ショップの最終価値のみを取得します。私は各ショップのペット価格を合計できるようにしたいと思います。例:
法律ペットショップ:7.00
と別の法律ペットショップ:5.00、
私はこのように出力したいと思います:
法律ペットショップ:13.00。出力この時点で同じキーでハッシュマップ値を合計する方法java

public class AverageCost { 

    public void calc(ArrayList<Pet> pets){ 

     String name = ""; 
     double price = 0; 
     HashMap hm = new HashMap(); 

     for (Pet i : pets) { 
      name = i.getShop(); 
      price = i.getPrice(); 

      hm.put(name, price); 
     } 

     System.out.println(""); 
     // Get a set of the entries 
     Set set = hm.entrySet(); 
     // Get an iterator 
     Iterator i = set.iterator(); 
     // Display elements 
     while(i.hasNext()) { 

      Map.Entry me = (Map.Entry)i.next(); 
      System.out.print(me.getKey() + ": "); 
      System.out.println(me.getValue()); 
     } 
    } 
} 

されています:
は、ここでは、コードと出力され

水生アクロバット:7.06
ブライヤーパッチのPet Store:5.24
プレストンペット:18.11
の動物園:18.7
ギャレーペット:16.8
げっ歯類以外のもの:8.53
Petsmart:21.87
Morrisペットと供給:7.12

+0

または8)?期待される結果は何ですか? –

+6

'HashMap'は重複するキーを持つことができません。同じキーに関連付けられた値は1つだけなので、質問はあまり意味がありません。 –

+0

@NicolasFilotto私は7を使用しています –

答えて

5

まず、具体的な収集タイプではなく、インターフェースにプログラムしてください。次に、raw typesを使用しないでください。次に、Mapにはペットの名前と価格の合計(したがってString, Double)が含まれている必要があります。何かのように、

public void calc(List<Pet> pets) { 
    Map<String, Double> hm = new HashMap<>(); 
    for (Pet i : pets) { 
     String name = i.getShop(); 
     // If the map already has the pet use the current value, otherwise 0. 
     double price = hm.containsKey(name) ? hm.get(name) : 0; 
     price += i.getPrice(); 
     hm.put(name, price); 
    } 
    System.out.println(""); 
    for (String key : hm.keySet()) { 
     System.out.printf("%s: %.2f%n", key, hm.get(key)); 
    } 
} 
+0

正解!しかし、私は本当に各ループの最後を理解していません。私は苦痛になりたくはありませんが、あなたはそれを打ち砕くことができますか? –

+0

'Map'(キーセット)の各キーに対して、' key'( 'hm.get(key)')で参照される 'key'と' value'を出力します。 –

+0

oh okですが、この場合、各店舗の平均価格を計算するにはどうすればよいですか?私は各店舗の番号を持っていないので... –

1

あなた総和ならば、あなたはあなたがHashMapのから値を取得し、その

double price = hm.get(name) == null ? 0 : hm.get(name) ; 
hm.put(name,price + i.getPrice()) 

に価格を追加する必要がある値を足し必要があります。 Javaの8で

1

あなたはこれを行うには、ストリームAPIを使用することができます:Mapインターフェースで有用な方法V getOrDefault(Object key, V defaultValue)

Map<String, Double> map = pets.stream() 
       .collect(Collectors.groupingBy(Pet::getShop, Collectors.summingDouble(Pet::getPrice))); 
2

があります。指定されたキーがマッピングされている値を返します。このマップにキーのマッピングが含まれていない場合はdefaultValueを返します。私たちの場合、それはこのように使用することができます。また

HashMap<String,Double> hm = new HashMap<>(); 

     for (Pet i : pets) { 
      name = i.getShop(); 
      price = i.getPrice(); 

      hm.put(name, getOrDefault(name, 0) + price); 
     } 

、我々は、Java 8でのメソッド参照を使用して、よりエレガントな解決策を得ることができます:

のJavaのバージョンを使用すると、(6、7を使用してください
HashMap<String,Double> hm = new HashMap<>(); 

     for (Pet i : pets) { 
      name = i.getShop(); 
      price = i.getPrice(); 

      hm.merge(name, price, Double::sum); 
     } 
関連する問題