Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用相同的键计算hashmap值的平均值_Java_Hashmap - Fatal编程技术网

Java 如何使用相同的键计算hashmap值的平均值

Java 如何使用相同的键计算hashmap值的平均值,java,hashmap,Java,Hashmap,所以我有一个程序,它计算所有具有相同键但不同值的Petshop的总和。但是,现在,我想计算具有相同密钥的每个petshop的平均值。我正在考虑使用计数器来获取arraylist中包含宠物店的次数。但它不起作用。我需要为每个循环运行另一个循环吗 public class AverageCost { public void calc(ArrayList<Pet> pets) { Map<String, Double> hm = new HashM

所以我有一个程序,它计算所有具有相同键但不同值的Petshop的总和。但是,现在,我想计算具有相同密钥的每个petshop的平均值。我正在考虑使用计数器来获取arraylist中包含宠物店的次数。但它不起作用。我需要为每个循环运行另一个循环吗

public class AverageCost {

    public void calc(ArrayList<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: %s%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:%s%n”,key,hm.get(key));
}
}

您可以引入第二张地图进行计数,或者在地图中使用复合值对象来保存宠物的累计价格和数量:

Map<String, PetStatistics> hm = new HashMap<>();
for (Pet i : pets) {
    String name = i.getShop();
    // If the map already has the pet use the current value, otherwise 0.

    PetStatistics stats = hm.get(name);
    if (stats == null) {
        stats = new PetStatistics(0, 0); // count and price
        hm.put(name, stats);
    }
    stats.addPrice(i.getPrice());
    stats.incrementCount();
}
Map hm=newhashmap();
用于(宠物i:宠物){
字符串名称=i.getShop();
//如果地图上已经有宠物,请使用当前值,否则为0。
PetStatistics=hm.get(name);
如果(stats==null){
stats=new-PetStatistics(0,0);//计数和价格
hm.put(姓名、统计数据);
}
stats.addPrice(i.getPrice());
stats.incrementCount();
}

您可以引入第二张地图进行计数,或者在地图中使用复合值对象来保存宠物的累计价格和数量:

Map<String, PetStatistics> hm = new HashMap<>();
for (Pet i : pets) {
    String name = i.getShop();
    // If the map already has the pet use the current value, otherwise 0.

    PetStatistics stats = hm.get(name);
    if (stats == null) {
        stats = new PetStatistics(0, 0); // count and price
        hm.put(name, stats);
    }
    stats.addPrice(i.getPrice());
    stats.incrementCount();
}
Map hm=newhashmap();
用于(宠物i:宠物){
字符串名称=i.getShop();
//如果地图上已经有宠物,请使用当前值,否则为0。
PetStatistics=hm.get(name);
如果(stats==null){
stats=new-PetStatistics(0,0);//计数和价格
hm.put(姓名、统计数据);
}
stats.addPrice(i.getPrice());
stats.incrementCount();
}

您需要的是一种算法,用于计算累计移动平均值,而不存储迄今为止累计的术语数量。我认为这是不可能的(例如,请参见其中“n”,即迄今为止需要的术语数量).我的建议是使用两次传递-第一次用于存储数字,第二次用于计算平均值

public void calc(List<Pet> pets) {
    // First pass
    Map<String, List<Double>> firstPass = new HashMap<>();
    for (Pet pet : pets) {
        String name = pet.getShop();
        if (firstPass.containsKey(name)) {
            firstPass.get(name).add(pet.getPrice());
        } else {
            List<Double> prices = new ArrayList<>();
            prices.add(pet.getPrice());
            firstPass.put(name, prices);
        }
    }

    // Second pass
    Map<String, Double> results = new HashMap<>();
    for (Map.Entry<String, List<Double>> entry : firstPass.entrySet()) {
        Double average = calcAverage(entry.getValue());
        results.put(entry.getKey(), average);
        // Print results
        System.out.printf("%s: %s%n", entry.getKey(), average);
    }
}

private double calcAverage(List<Double> values) {
    double result = 0;
    for (Double value : values) {
        result += value;
    }
    return result / values.size();
}
公共作废计算(列出宠物){
//第一关
Map firstPass=newhashmap();
用于(宠物:宠物){
字符串名称=pet.getShop();
if(首次通行证。集装箱(名称)){
firstPass.get(name.add(pet.getPrice());
}否则{
标价=新的ArrayList();
添加(pet.getPrice());
首次通行证(名称、价格);
}
}
//第二关
映射结果=新的HashMap();
for(Map.Entry:firstPass.entrySet()){
双重平均=平均值(entry.getValue());
results.put(entry.getKey(),average);
//打印结果
System.out.printf(“%s:%s%n”,entry.getKey(),average);
}
}
私有双平均值(列表值){
双结果=0;
for(双值:值){
结果+=数值;
}
返回结果/值。size();
}

您需要的是一种算法,用于计算累计移动平均值,而不存储迄今为止累计的术语数量。我认为这是不可能的(例如,请参见其中“n”,即迄今为止需要的术语数量).我的建议是使用两次传递-第一次用于存储数字,第二次用于计算平均值

public void calc(List<Pet> pets) {
    // First pass
    Map<String, List<Double>> firstPass = new HashMap<>();
    for (Pet pet : pets) {
        String name = pet.getShop();
        if (firstPass.containsKey(name)) {
            firstPass.get(name).add(pet.getPrice());
        } else {
            List<Double> prices = new ArrayList<>();
            prices.add(pet.getPrice());
            firstPass.put(name, prices);
        }
    }

    // Second pass
    Map<String, Double> results = new HashMap<>();
    for (Map.Entry<String, List<Double>> entry : firstPass.entrySet()) {
        Double average = calcAverage(entry.getValue());
        results.put(entry.getKey(), average);
        // Print results
        System.out.printf("%s: %s%n", entry.getKey(), average);
    }
}

private double calcAverage(List<Double> values) {
    double result = 0;
    for (Double value : values) {
        result += value;
    }
    return result / values.size();
}
公共作废计算(列出宠物){
//第一关
Map firstPass=newhashmap();
用于(宠物:宠物){
字符串名称=pet.getShop();
if(首次通行证。集装箱(名称)){
firstPass.get(name.add(pet.getPrice());
}否则{
标价=新的ArrayList();
添加(pet.getPrice());
首次通行证(名称、价格);
}
}
//第二关
映射结果=新的HashMap();
for(Map.Entry:firstPass.entrySet()){
双重平均=平均值(entry.getValue());
results.put(entry.getKey(),average);
//打印结果
System.out.printf(“%s:%s%n”,entry.getKey(),average);
}
}
私有双平均值(列表值){
双结果=0;
for(双值:值){
结果+=数值;
}
返回结果/值。size();
}

您可以使用Collections.frequency获取发生次数并除以整个总和

for (String key : hm.keySet()) {
    int w = Collections.frequency(pets, new Pet(key));
    System.out.printf("%s: %s%n", key, hm.get(key)/w);
}

您可以使用Collections.frequency来获取发生次数并除以总和

for (String key : hm.keySet()) {
    int w = Collections.frequency(pets, new Pet(key));
    System.out.printf("%s: %s%n", key, hm.get(key)/w);
}

你的问题让我有点困惑。在
哈希映射中不能有重复的键。因此,当你说
时,我想计算具有相同键的每个petshop的平均值,每个键只有一个条目。你可以引入第二个映射进行计数,或者在映射中使用复合值对象来保存两个累积价格宠物数量:
Map hm
也许你想在hashmap上存储平均值,不是吗?例如:Law Pet shop:7.00和另一家Law Pet shop:5.00,输出:Law Pet shop:13.00。这是当前的输出,是一个加法。但现在我想计算平均值。hashmap不是这样工作的。你永远不会有一个ent用“法律宠物店”的钥匙在地图上搜索和另一个具有相同密钥的条目。当您尝试存储具有相同密钥的第二个或后续条目时,会覆盖上一个条目。我对您的问题有点困惑。在
哈希映射中不能有重复的密钥。因此,当您说
时,我想计算具有相同密钥的每个petshop的平均值每把钥匙只能输入一个条目。您可以引入第二个地图进行计数,或者在地图中使用复合值对象来保存宠物的累计价格和数量