Не могу реализовать метод

import java.sql.SQLOutput;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        System.out.println("На какое кол-во человек необходимо разделить счет?");
        int peopleNum = s.nextInt();
        if (peopleNum == 1 || peopleNum < 1) {
            System.out.println("Введите корректное число");
        }
        System.out.println("Введите название товара и сумму");
        
        String[] menuArray = new String[100];
        double[] sumArray = new double[100];
        for (int i = 0; i < menuArray.length; i++) {
            menuArray[i] = s.nextLine();
            for (int b = 0; b < sumArray.length; b++) {
                sumArray[b] = s.nextInt();
            }
            if (menuArray[i].equalsIgnoreCase("завершить")) {
                break;
            }
        }
    }

}

Мне нужно, чтобы пользователь вводил название товара и сумму, товар и сумма должны добавляться в массив.

Затем надо, чтобы этот цикл повторялся до тех пор, пока я не напишу завершить в консоли.

Далее мне надо будет показать то, что записал в массив String, и сложить сумму, которая должна быть в массиве double, эту сумму поделить на число, введенное в peopleNum.


Ответы (2 шт):

Автор решения: Nowhere Man

Возможный вариант решения с устранением ошибок в коде вопроса:

  • Ввод peopleNum в цикле, пока не будет введено корректное число.
  • Использование Scanner::nextLine + Integer.parseInt / Double.parseDouble для ввода пользователя (при таком способе десятичным разделителем всегда в числах будет точка, независимо от локали); строки и числа всегда вводятся с новой строки.
  • Подсчёт количества пунктов меню при вводе в отдельной переменной count, которое не может превышать заранее заданного ограничения (max = 100).
  • Использование форматированного вывода System.out.printf
import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        System.out.println("На какое количество человек необходимо разделить счет (не менее 2)?");

        int peopleNum;
        while ((peopleNum = Integer.parseInt(scan.nextLine())) < 2) {
            System.out.println("Введите корректное число");
        }
        int max = 100;
        System.out.println("Введите название товара и сумму, не более " + max + " значений, или \"завершить\"");
        
        String[] items = new String[max];
        double[] amounts = new double[max];
        int count = 0;
        String input;
        // ввод
        while (count < max && !"завершить".equalsIgnoreCase(input = scan.nextLine())) {
            items[count] = input;
            amounts[count] = Double.parseDouble(scan.nextLine());
            count++;
            System.out.println("Введите следующий товар и сумму или \"завершить\" для окончания ввода");
        }
        // вывод и вычисление общей суммы
        double total = 0d;
        for (int i = 0; i < count; i++) {
            System.out.printf("%3d. %s: %.2f%n", i + 1, items[i], amounts[i]);
            total += amounts[i];
        }
        System.out.printf("Общая сумма: %.2f, средняя сумма на одного: %.2f%n", total, total / peopleNum);        
    }
}

Небольшой пример использования стандартных возможностей Java (списки, кортежи, Stream API)

Код для решения данной задачи можно немного упростить, заменив обычные массивы с фиксированной длиной item, amounts списком List.

Размер списка будет автоматически увеличиваться при вводе новых данных, и не нужно будет вводить и проверять ограничения на максимальную длину в виде max = 100.

Также вместо двух отдельных списков следует использовать отдельный класс с полями "название" и "сумма", для чего в частности удобно использовать кортежи record.
Для вычисления суммы элементов списка можно использовать Stream API.

Вариант решения:

import java.util.*;

public class MyClass {
    
    // кортеж для "строк" данных: название пункта меню и сумма 
    record Item(String name, double amount){}
    
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        System.out.println("На какое количество человек необходимо разделить счет (не менее 2)?");

        int peopleNum;
        while ((peopleNum = Integer.parseInt(scan.nextLine())) < 2) {
            System.out.println("Введите корректное число");
        }
        System.out.println("Введите название товара и сумму, или \"завершить\"");
        
        List<Item> items = new ArrayList<>(); // один список вместо двух массивов
        String input;
        // ввод
        while (!"завершить".equalsIgnoreCase(input = scan.nextLine())) {
            items.add(new Item(input, Double.parseDouble(scan.nextLine())));
            System.out.println("Введите следующий товар и сумму или \"завершить\" для окончания ввода");    
        }
        // вывод и вычисление общей суммы
        double total = items.stream().mapToDouble(Item::amount).sum();
        items.forEach(System.out::println);
        System.out.printf("Общая сумма: %.2f, средняя сумма на одного: %.2f%n", total, total / peopleNum);
    }
}
→ Ссылка
Автор решения: anonymus

Вот пример того, как можно это сделать:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("На какое кол-во человек необходимо разделить счет?");
        int peopleNum = scanner.nextInt();

        while (peopleNum <= 1) {
            System.out.println("Введите корректное число (больше 1):");
            peopleNum = scanner.nextInt();
        }

        scanner.nextLine(); // Очистка буфера

        String[] menuArray = new String[100];
        double[] sumArray = new double[100];
        int itemCount = 0; // Счётчик товаров

        System.out.println("Введите название товара и его сумму через пробел или 'завершить' для окончания ввода:");
        while (true) {
            String input = scanner.nextLine();
            if ("завершить".equalsIgnoreCase(input)) {
                break; // Завершаем цикл, если пользователь ввёл "завершить"
            }

            String[] parts = input.split(" ");
            if (parts.length != 2) {
                System.out.println("Некорректный ввод, попробуйте ещё раз:");
                continue;
            }

            String itemName = parts[0];
            double itemSum;

            try {
                itemSum = Double.parseDouble(parts[1]);
            } catch (NumberFormatException e) {
                System.out.println("Сумма должна быть числом, попробуйте ещё раз:");
                continue;
            }

            menuArray[itemCount] = itemName;
            sumArray[itemCount] = itemSum;
            itemCount++;

            if (itemCount >= menuArray.length) {
                System.out.println("Достигнут предел товаров!");
                break; // Завершить цикл, если достигнут предел массива
            }
        }

        double totalSum = 0;
        for (int i = 0; i < itemCount; i++) {
            totalSum += sumArray[i]; // Суммирование стоимости товаров
            System.out.println("Товар: " + menuArray[i] + ", Сумма: " + sumArray[i]);
        }

        double dividedSum = totalSum / peopleNum;
        System.out.printf("Общая сумма: %.2f\n", totalSum);
        System.out.printf("Каждый человек должен заплатить: %.2f\n", dividedSum);
    }
}
→ Ссылка