试图打印出花费最多的“最佳客户”

时间:2014-11-06 22:34:08

标签: java arrays arraylist max

这是我到目前为止所得到的。我可以获得最高金额,但我无法弄清楚如何将客户名称与他们的销售联系起来,然后用他们的总数打印他们的名字。

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));
}
}

1 个答案:

答案 0 :(得分:1)

您正在使用&#34; parallel&#34;列表,即两个单独的列表,预期彼此1:1对应:

ArrayList<Double> sales = new ArrayList<Double>();
ArrayList<String> customer = new ArrayList<String>();

在您学习的过程中,就管理信息而言,这会遇到一些困难。如果您想继续使用这些列表,最好的方法是通过列表中的索引集中识别客户+销售。 Collections.max()只返回最大,而不是索引,因此您可以手动实现该逻辑。假设你的列表不是空的,那么通常会有一个算法(实现是为了让你解决):

  1. 最初假设最高项目是列表中的第一项,因此最高项目的索引最初为0。
  2. 对于其余每个项目,如果该项目大于最高项目,请将新的最高项目索引设置为该项目的索引。
  3. 现在,您可以使用最高项的索引作为两个数组的索引。

    但是,更好的方法是创建一个小型自定义类,以便在一个地方保存有关销售的所有信息。例如:

    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的方法;你的选择是:

    1. Transaction实施Comparable<Transaction>
    2. 定义可以比较销售额的Comparator<Transaction>
    3. 我会把这些细节作为练习留给你 - 查看object ordering的官方教程,它简短,简洁,并包含很好的例子。完成此操作后,您现在可以使用Collections.max()version that takes a Comparator用于选项2,或version that doesn't用于选项1)的基础结构,max()将现在直接返回Transaction对象,其中包含金额和客户名称。