如何使用相同的密钥java

时间:2016-04-11 16:33:15

标签: java hashmap

所以我遇到了一个问题,我必须在HashMap中使用相同的键添加所有值。数据(petshop和宠物价格)是从ArrayList中检索的。目前,该计划只获得每个商店的最后价值,因为有多个商店名称相同但宠物价格不同。我希望能够为每个商店的宠物价格加起来。所以,如果我们有,例如,
法律宠物店:7.00
和另一家法律宠物店:5.00,我想这样输出:
法律宠物店:13.00。
这是代码和输出:

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
Briar Patch宠物店:5.24
普雷斯顿宠物:18.11
动物园:18.7
厨房宠物:16.8
除了獾之外的任何东西:8.53
Petsmart:21.87
莫里斯宠物和用品:7.12

4 个答案:

答案 0 :(得分: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));
    }
}

答案 1 :(得分:2)

V getOrDefault(Object key, V defaultValue)界面中有一个有用的方法Map。它返回指定键映射到的值,如果此映射不包含键的映射,则返回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中的方法引用获得更优雅的解决方案:

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

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

            hm.merge(name, price, Double::sum);
        }

答案 2 :(得分:1)

如果您是总和,那么您需要将值加起来,您应该从HashMap获取值并将价格添加到

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

答案 3 :(得分:1)

在Java 8中,您可以使用streams api来执行此操作:

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