Петля не в ту сторону?

Задание для моего класса просит меня создать программу, которая говорит супермаркету, какой клиент, на ежедневной основе, потратил больше всего денег в магазине. Программа должна найти этого клиента и отобразить его имя.

Цели задания-работать с несколькими классами, работать с ArrayListsполученными знаниями и применять их на практике.

Мой вопрос:

  1. Как сделать цикл из двух выходных операторов в основном классе? Правильно ли это в моем основном методе? Мне нужно сделать петлю, пока страж не будет использован.
  2. Как это повлияет на моего стража?
  3. Какие вопросы я должен задавать себе при работе с петлями? Хотелось бы думать, что я слишком много думаю об этой части.

Я очень хочу понять, что я здесь делаю,поэтому любая помощь в правильном направлении будет оценена! Заранее спасибо, что нашли время помочь мне!

import java.util.Scanner;

public class main {

public static void main(String[] args) {

    System.out.println("* * * * * THE SUPERMARKET * * * * *");
    System.out.println("       Written by Nate Irwin");
    System.out.println();

    double finalTotal = -1;
    String anAccountName;

    Scanner input = new Scanner(System.in);
    Store store = new Store();

    do {
        System.out.println("Enter the customer name: ");
        if(input.hasNextLine()){
            anAccountName = input.nextLine();
            System.out.println("Enter customer total price, hit 0 to QUIT: ");
            finalTotal = input.nextDouble();
            store.addAccount(anAccountName, finalTotal);
            System.out.println();
        }
    } while (finalTotal != 0);

    System.out.println(store.getHighestCustomerTotal() + " has spent the most with us today!");
}
}

Store класс:

import java.util.ArrayList;

public class Store {
    // Creates an ArrayList.
    private ArrayList<CustomerAccount> accounts = new    ArrayList<CustomerAccount>();

    //
    public void addAccount(String anAccountName, double finalTotal) {
        accounts.add(new CustomerAccount(anAccountName, finalTotal));
    }

    // Gets the HIGHEST customer total.
    public String getHighestCustomerTotal() {

        CustomerAccount highest = accounts.get(0);

        for (int i = 1; i < accounts.size(); i++) {
            if (accounts.get(i).getTotal() > highest.getTotal())
            {
                highest = accounts.get(i);
            }
        }

        return highest.getAccountName();
    }

}

CustomerAccount класс:

public class CustomerAccount {
    // Variables defined to this class.
    private String accountName;
    private double total;

    // Constructor.
    public CustomerAccount(String anAccountName, double finalTotal) {
        accountName = anAccountName;
        total = finalTotal;
    }

    // Gets total from each customer.
    public double getTotal() {
        return total;
    }

    // Gets a customer's name.
    public String getAccountName() {
        return accountName;
    }
}

2 ответа

  1. Ваш цикл в главном:

    • На самом деле не использует данные, которые вы вводите… Можно ожидать, что эти данные будут использоваться для создания экземпляров CustomerAccount
    • Имеет совершенно ненужный while(Condition)тест в конце. Этот вид петли нормально сделан с А While Trueи некоторым тестом в проломах петли из петли.

    ВgetHighestCustomerTotal()

    • вместо итерации индекса можно использовать более» современную » форму for()элементов списка, в которой выполняется итерация.
  2. Я думаю, что ваш подход хорош,он делает свою работу.

    Я не слишком уверен в том, что вы спрашиваете, говоря, как вы должны цикл двух выходных операторов, а затем, если это должно быть в основном методе. Из того, что я понимаю, и глядя на ваш код, выполнение этого входного цикла отлично от основного класса. Do-while отлично, хотя я бы переместил первый «вводный» выход за пределы цикла, поэтому вы не видите его каждый раз, когда цикл повторяется.
    Кроме того, я замечаю, что вы на самом деле не вызываете/создаете экземпляр Storeкласса в своем основном методе, нет никаких данных, добавляемых в Storeкласс для того, когда он итерирует через ArrayList учетных записей.

    Что касается ответа, который сформулировал более «современный» подход, я думаю, что цикл for, который вы использовали, хорош. Я думаю, что человек имел в виду для каждого цикла. На самом деле не имеет значения, как вы проходите через него с небольшим количеством данных, которые у вас есть.

    Есть некоторая ошибка в логике этого цикла. getHighestCustomerTotal()Ссылка на пустой ArrayList учетных записей. Вы объявили ArrayList в Storeклассе и попытались пройти через него, но он пуст, если вы не вызвали addAccount()метод из своего основного метода в какой-то момент, поэтому вам нужно будет проверить ошибку на этом.