根据内部地图外部的键,对嵌套地图中的值求和

时间:2019-11-27 09:36:27

标签: java dictionary hashmap nested

  import java.util.*;

public class Orders {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<String, Map<Double, Double>> myMap = new LinkedHashMap<String, Map<Double, Double>>();


        String input = "";
        while (true) {

            input = scanner.nextLine();
            String[] tokens = input.split(" ");
            String name = tokens[0];
            if ("buy".equals(name)) {
                break;
            }
            double price = Double.parseDouble(tokens[1]);
            double quantity = Double.parseDouble(tokens[2]);
            Map<Double, Double> innerMap = myMap.get(name);
            myMap.put(name, innerMap = new HashMap<>());


            innerMap.put(price, quantity);
            Double existingQuantity = innerMap.get(price);

            if (myMap.containsKey(name)) {
                innerMap.replace(innerMap.get(price), price);
                myMap.get(name).put(price, existingQuantity + quantity);
            }



        }
        System.out.println(myMap);
    }
}

你好

我要在此处执行的操作是,每次输入外部地图的重复键(名称)时,都要对innerMap的值(数量)求和。 我做了很多研究,但没有找到与我相似的案例。

例如,输入

Water 1.20 500
Water 1.20 300
buy

应该屈服

Water 1.20 800

也抱歉我的英语。

3 个答案:

答案 0 :(得分:1)

您似乎需要更换

innerMap.put(price, quantity);

使用

innerMap.merge(price, quantity, (q1,q2)->q1+q2);

这样,将对所有具有相同名称和相同价格的数量进行求和。

似乎还应该更改

Map<Double, Double> innerMap = myMap.get(name);
myMap.put(name, innerMap = new HashMap<>());

Map<Double, Double> innerMap = myMap.get(name);
if (innerMap == null) {
    myMap.put(name, innerMap = new HashMap<>());
}

因为您不想在每次遇到该名称时都覆盖该名称的内部Map

总结:

while (true) {
    input = scanner.nextLine();
    String[] tokens = input.split(" ");
    String name = tokens[0];
    if ("buy".equals(name)) {
        break;
    }
    double price = Double.parseDouble(tokens[1]);
    double quantity = Double.parseDouble(tokens[2]);
    Map<Double, Double> innerMap = myMap.get(name);
    if (innerMap == null) {
        myMap.put(name, innerMap = new HashMap<>());
    }
    innerMap.merge(price, quantity, (q1,q2)->q1+q2);
}

我相信可以将其进一步简化如下:

while (true) {
    input = scanner.nextLine();
    String[] tokens = input.split(" ");
    String name = tokens[0];
    if ("buy".equals(name)) {
        break;
    }
    double price = Double.parseDouble(tokens[1]);
    double quantity = Double.parseDouble(tokens[2]);
    myMap.computeIfAbsent(name,n -> new HashMap<>())
         .merge(price, quantity, (q1,q2)->q1+q2);
}

编辑:对于您在注释中的请求,您必须继续替换内部地图的键:

while (true) {
    input = scanner.nextLine();
    String[] tokens = input.split(" ");
    String name = tokens[0];
    if ("buy".equals(name)) {
        break;
    }
    double price = Double.parseDouble(tokens[1]);
    double quantity = Double.parseDouble(tokens[2]);
    Map<Double, Double> innerMap = myMap.computeIfAbsent(name,n -> new HashMap<>());
    if (innerMap.isEmpty()) {
        innerMap.put(price,quantity);
    } else {
        innerMap.put(price,quantity + innerMap.remove(innerMap.keySet().iterator().next()));
    }
}

答案 1 :(得分:1)

希望。这有帮助

           if ("buy".equals(name)) 
           {
                break;
            }
            double price = Double.parseDouble(tokens[1]);
            double quantity = Double.parseDouble(tokens[2]);
            Map<Double, Double> innerMap = myMap.getOrDefault(name, new HashMap<>());
            Double existingQuantity = innerMap.getOrDefault(price, 0.0);
            innerMap.put(price, existingQuantity + quantity);
            myMap.put(name, innerMap);

答案 2 :(得分:1)

这将起作用

import java.util.*;

public class App {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<String, Map<Double, Double>> myMap = new LinkedHashMap<String, Map<Double, Double>>();


        String input = "";
        while (true) {

            input = scanner.nextLine();
            String[] tokens = input.split(" ");
            String name = tokens[0];
            if ("buy".equals(name)) {
                break;
            }
            double price = Double.parseDouble(tokens[1]);
            double quantity = Double.parseDouble(tokens[2]);


            if(!myMap.containsKey(name)){
                myMap.put(name,new HashMap<>());

            }
            if(myMap.get(name).containsKey(price)){
                double previousQuantity  = myMap.get(name).get(price);
                myMap.get(name).put(price,previousQuantity+quantity);

            }
            else {

                myMap.get(name).put(price,quantity);

            }


        }
        System.out.println(myMap);
    }
}