这是我到目前为止所得到的。我可以获得最高金额,但我无法弄清楚如何将客户名称与他们的销售联系起来,然后用他们的总数打印他们的名字。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class HW5 {
public static void nameOfBestCustomer(ArrayList<Double> sales,
ArrayList<String> customers) {
}
public static void main(String[] args) {
ArrayList<Double> sales = new ArrayList<Double>();
ArrayList<String> customer = new ArrayList<String>();
int[][] BestCustomer = new int[1][10];
Scanner in = new Scanner(System.in);
System.out.print("Total Number of Customers: ");
int num = in.nextInt();
for (int i = 0; i < num; i++) {
System.out.print("Enter name of customer " + (i + 1) + ": \n");
customer.add(in.next());
System.out.print("Total amount for customer " + (i + 1) + ": \n");
sales.add(in.nextDouble());
}
double maximum = Collections.max(sales);
System.out.println("The Best Customer is " + customer
+ "with a purchase of ");
System.out.println(String.format("$%.2f", maximum));
}
}
答案 0 :(得分:1)
您正在使用&#34; parallel&#34;列表,即两个单独的列表,预期彼此1:1对应:
ArrayList<Double> sales = new ArrayList<Double>();
ArrayList<String> customer = new ArrayList<String>();
在您学习的过程中,就管理信息而言,这会遇到一些困难。如果您想继续使用这些列表,最好的方法是通过列表中的索引集中识别客户+销售。 Collections.max()
只返回最大值,而不是索引,因此您可以手动实现该逻辑。假设你的列表不是空的,那么通常会有一个算法(实现是为了让你解决):
现在,您可以使用最高项的索引作为两个数组的索引。
但是,更好的方法是创建一个小型自定义类,以便在一个地方保存有关销售的所有信息。例如:
static class Transaction {
double sale;
String customer;
}
现在你可以维护一个数组:
ArrayList<Transaction> transactions = new ArrayList<Transaction>();
将交易存储在该数组中:
Transaction t = new Transaction();
t.sale = ...;
t.customer = ...;
transactions.add(t);
然后你必须有一种比较两个Transaction
的方法;你的选择是:
Transaction
实施Comparable<Transaction>
或Comparator<Transaction>
。我会把这些细节作为练习留给你 - 查看object ordering的官方教程,它简短,简洁,并包含很好的例子。完成此操作后,您现在可以使用Collections.max()
(version that takes a Comparator
用于选项2,或version that doesn't用于选项1)的基础结构,max()
将现在直接返回Transaction
对象,其中包含金额和客户名称。