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
也抱歉我的英语。
答案 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);
}
}