如何使用相同的java键对hashmap值求和

如何使用相同的java键对hashmap值求和,java,hashmap,Java,Hashmap,所以我遇到了一个问题,我必须在HashMap中用同一个键将所有值相加。数据(宠物商店和宠物价格)从ArrayList中检索。目前,该程序只获取每个商店的最后一个值,因为有多个商店名称相同,但宠物价格不同。我想能够计算每个商店的宠物价格。比如说,如果我们有, 法律宠物店:7.00和另一家法律宠物店:5.00,我想这样输出:法律宠物店:13.00以下是代码和输出: public class AverageCost { public void calc(ArrayList<Pet>

所以我遇到了一个问题,我必须在HashMap中用同一个键将所有值相加。数据(宠物商店和宠物价格)从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());
        }
    }
}
公共类平均成本{
公共无效计算(ArrayList pets){
字符串名称=”;
双倍价格=0;
HashMap hm=新的HashMap();
用于(宠物i:宠物){
name=i.getShop();
price=i.getPrice();
hm.put(名称、价格);
}
System.out.println(“”);
//获取一组条目
Set=hm.entrySet();
//获取迭代器
迭代器i=set.Iterator();
//显示元素
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

首先,请编程到界面(而不是具体的收集类型)。第二,请不要使用。接下来,您的
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));
    }
}
公共作废计算(列出宠物){
Map hm=新的HashMap();
用于(宠物i:宠物){
字符串名称=i.getShop();
//如果地图上已经有宠物,请使用当前值,否则为0。
双倍价格=hm.containsKey(名称)?hm.get(名称):0;
price+=i.getPrice();
hm.put(名称、价格);
}
System.out.println(“”);
for(字符串键:hm.keySet()){
System.out.printf(“%s:%.2f%n”,key,hm.get(key));
}
}

首先,请编程到接口(而不是具体的集合类型)。第二,请不要使用。接下来,您的
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));
    }
}
公共作废计算(列出宠物){
Map hm=新的HashMap();
用于(宠物i:宠物){
字符串名称=i.getShop();
//如果地图上已经有宠物,请使用当前值,否则为0。
双倍价格=hm.containsKey(名称)?hm.get(名称):0;
price+=i.getPrice();
hm.put(名称、价格);
}
System.out.println(“”);
for(字符串键:hm.keySet()){
System.out.printf(“%s:%.2f%n”,key,hm.get(key));
}
}

如果要计算总和,则需要将从HashMap获得的值相加,并将价格加到该值中

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

)

如果要计算总和,则需要将从HashMap获得的值相加,并将价格加到该值中

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

)

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

Map<String, Double> map = 
        pets.stream().collect(
            Collectors.groupingBy(
                Pet::getShop,
                Collectors.summingDouble(Pet::getPrice)
            )
        );
Map=
pets.stream().collect(
收集者分组(
宠物:getShop,
收集器.summingDouble(Pet::getPrice)
)
);

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

Map<String, Double> map = 
        pets.stream().collect(
            Collectors.groupingBy(
                Pet::getShop,
                Collectors.summingDouble(Pet::getPrice)
            )
        );
Map=
pets.stream().collect(
收集者分组(
宠物:getShop,
收集器.summingDouble(Pet::getPrice)
)
);

映射
界面中有一个有用的方法
V getOrDefault(对象键,V defaultValue)
。它返回指定键映射到的值,如果此映射不包含该键的映射,则返回defaultValue。在我们的案例中,它可以这样使用:

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

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

            hm.put(name, getOrDefault(name, 0) + price);
        }
HashMap hm=newhashmap();
用于(宠物i:宠物){
name=i.getShop();
price=i.getPrice();
hm.put(名称,getOrDefault(名称,0)+价格);
}
此外,我们可以使用Java 8中的方法引用获得更优雅的解决方案:

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

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

            hm.merge(name, price, Double::sum);
        }
HashMap hm=newhashmap();
用于(宠物i:宠物){
name=i.getShop();
price=i.getPrice();
hm.merge(名称、价格、双倍::总和);
}

映射
界面中有一个有用的方法
V getOrDefault(对象键,V defaultValue)
。它返回指定键映射到的值,如果此映射不包含该键的映射,则返回defaultValue。在我们的案例中,它可以这样使用:

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

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

            hm.put(name, getOrDefault(name, 0) + price);
        }
HashMap hm=newhashmap();
用于(宠物i:宠物){
name=i.getShop();
price=i.getPrice();
hm.put(名称,getOrDefault(名称,0)+价格);
}
此外,我们可以使用Java 8中的方法引用获得更优雅的解决方案:

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

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

            hm.merge(name, price, Double::sum);
        }
HashMap hm=newhashmap();
用于(宠物i:宠物){
name=i.getShop();
price=i.getPrice();
hm.merge(名称、价格、双倍::总和);
}

您使用哪个版本的Java(6、7或8)?预期的结果是什么?您知道
HashMap
不能有重复的键吗?只有一个值与同一个键关联,因此您的问题没有多大意义。@NicolasFilotto我使用的是7@ÓscarLópez是的,我知道他们只能有一个键,但我认为有一种方法可以添加具有相同键的商店的值。然后,在放置前检查您的地图中是否存在该键。如果存在,则将新金额添加到当前金额。您使用哪个版本的Java(6、7或8)?预期的结果是什么?您知道
HashMap
不能有重复的键吗?那里有