一個完全新手的問題。對不起。
我有這個customersOrders HashMap作為String鍵和ArrayList<Double>值。我需要找到每個客戶的訂單總和和最大總和才能找到最大的客戶。我如何僅使用嵌套For回圈和HashMap方法來做到這一點?我完全堅持這一點。
public class Test {
public static void main(String[] args) {
HashMap<String, ArrayList<Double>> customersOrders;
customersOrders = new HashMap<>();
ArrayList<Double> orders = new ArrayList<>();
orders.add(55.50);
orders.add(78.30);
orders.add(124.75);
customersOrders.put("John", orders);
orders = new ArrayList<>();
orders.add(28.35);
orders.add(37.40);
customersOrders.put("Helen", orders);
orders = new ArrayList<>();
orders.add(150.10);
customersOrders.put("Thomas", orders);
orders = new ArrayList<>();
orders.add(230.45);
orders.add(347.20);
customersOrders.put("Robert", orders);
orders = new ArrayList<>();
orders.add(530.25);
orders.add(325.40);
orders.add(11550.70);
orders.add(2480.65);
customersOrders.put("Jennifer", orders);
System.out.println(customersOrders);
}
}
到目前為止,我一直在嘗試做這樣的事情,但顯然沒有成功:
double maxOrder = 0;
String customerName = "";
for (ArrayList<Double> orders : customersOrders.values()) {
for (double orderPrice : orders) {
if (orderPrice > maxOrder) {
maxOrder = orderPrice;
}
}
}
for (String name : customersOrders.keySet()) {
if (maxOrder.equals(customersOrders.get(name))) {
customerName = name;
break;
}
}
uj5u.com熱心網友回復:
您可以創建另一個HashMap來保留您的總和,然后找到其中的最大值。
首先遍歷所有HashMap鍵并找到每個客戶的總和,如下所示:
HashMap<String, ArrayList<Double>> customerOrders = new HashMap<>();
// Fill your HashMap as you've done above
HashMap<String, Double> customerSums = new HashMap<>(); // The new HashMap that keeps the sums
for (String customerName : customerOrders.keySet()) // Foreach customer
{
double currentSum = 0;
for (Double aDouble : customerOrders.get(customerName))
{
currentSum = aDouble; // Sum the orders
}
customerSums.put(customerName, currentSum); // Put the sum in your new HashMap
}
現在找到最大值應該非常簡單。嘗試這樣做:D
uj5u.com熱心網友回復:
也許是這樣的:
Map<String, Double> customersSum = new HashMap<>();
Double maxSum = Double.MIN_VALUE;
String customerWithMaxSum;
for (Map.Entry<String, List<Double>> entry: customersOrders.entrySet()) {
String customerId = entry.getKey();
List<Double> customerOrders = entry.getValue();
Double customerSum = customerOrders.stream().mapToDouble(d -> d).sum();
customersSum.put(customerId, customerSum);
if (customerSum > maxSum) {
maxSum = customerSum;
customerWithMaxSum = customerId;
}
}
第二部分也可以使用流 pi:
Optional<String> customerWithMaxSum = customersSum.entrySet()
.stream()
.max(Comparator.comparingDouble(Map.Entry::getValue))
.map(Map.Entry::getKey);
uj5u.com熱心網友回復:
你的邏輯代碼不正確
for (double orderPrice : orders) {
if (orderPrice > maxOrder) {
maxOrder = orderPrice;
}
}
您沒有添加價格然后與maxOrder您進行比較,而是將每個價格與 進行比較maxOrder。這不是您的問題所要求的。
你應該這樣做
double ordersSum = 0;
for (double orderPrice : orders) {
ordersSum = orderPrice;
}
if (ordersSum > maxOrder) {
maxOrder = ordersSum;
}
在第二個 for 回圈中,您將 double 值與 arraylist 進行比較,這會導致編譯錯誤,您應該將每個自定義產品的總和與maxOrder.
我應該在這里注意,這段代碼效率不高,您可以像在第二個回圈中那樣回圈鍵,然后計算其中的總和并與我進行比較,maxOrder我將把這個實作作為練習留給您。
uj5u.com熱心網友回復:
您正在迭代ordersMap 中的值。這不會告訴您與誰相關聯。相反,您可以遍歷鍵集或條目集,計算該客戶的總和,并將其與運行最大值進行比較。由于您指定使用 for 回圈,因此以下內容不包括使用 Stream API。
String maxOrderCustomer = null;
double maxOrder = 0.0;
for (Map.EntrySet<String,List<Double>> entry : customerOrders.entrySet()) {
Double sum = 0.0;
for (Double order : entry.getValue();
sum = order;
}
if (order > maxOrder) {
maxOrder = order;
maxOrderCustomer = entry.getKey();
}
}
此時,您將擁有總和最大的客戶名稱和總和值。如果要顯示相關的訂單串列,可以使用名稱從原始Map中拉取串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429724.html
上一篇:正則運算式匹配破折號后的所有文本
