Загрузка данных


import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;

public class ShoppingListAnalyzer {

    // Класс для удобного хранения данных о товаре
    static class Item {
        String name;
        BigDecimal price;

        Item(String name, BigDecimal price) {
            this.name = name;
            this.price = price;
        }
    }

    public static void main(String[] args) {
        // Имитируем содержимое текстового файла (массив строк)
        String[] fileLines = {
            "Молоко цельное пастеризованное 89.90",
            "Хлеб Бородинский нарезка 45",
            "Кофе в зернах Арабика 100% 1250.55",
            "Шоколад горький 99.9% 149.00",
            "Сыр Пармезан выдержанный 450.25"
        };

        List<Item> items = new ArrayList<>();
        BigDecimal totalPrice = BigDecimal.ZERO;

        // Обработка строк
        for (String line : fileLines) {
            if (line == null || line.trim().isEmpty()) {
                continue;
            }

            line = line.trim();
            
            // Находим последний пробел в строке
            int lastSpaceIndex = line.lastIndexOf(" ");
            
            if (lastSpaceIndex != -1) {
                // Разделяем: всё до последнего пробела — название, после — цена
                String name = line.substring(0, lastSpaceIndex).trim();
                String priceStr = line.substring(lastSpaceIndex + 1).trim();

                try {
                    // Используем BigDecimal для защиты от погрешностей float/double
                    BigDecimal price = new BigDecimal(priceStr);
                    items.add(new Item(name, price));
                    totalPrice = totalPrice.add(price);
                } catch (NumberFormatException e) {
                    System.out.println("Ошибка парсинга цены в строке: " + line);
                }
            }
        }

        int totalItems = items.size();
        if (totalItems == 0) {
            System.out.println("Список покупок пуст!");
            return;
        }

        // Расчет аналитики
        // Средняя цена = Итого / Количество
        BigDecimal averagePrice = totalPrice.divide(BigDecimal.valueOf(totalItems), 2, RoundingMode.HALF_UP);

        // НДС 20% внутри суммы: Цена * 20 / 120 (или Цена * 0.2 / 1.2)
        BigDecimal vatRate = new BigDecimal("0.20");
        BigDecimal vatDivider = new BigDecimal("1.20");
        BigDecimal vatAmount = totalPrice.multiply(vatRate).divide(vatDivider, 2, RoundingMode.HALF_UP);

        // Поиск самого дорогого и дешевого товара
        Item mostExpensive = items.get(0);
        Item leastExpensive = items.get(0);

        for (Item item : items) {
            if (item.price.compareTo(mostExpensive.price) > 0) {
                mostExpensive = item;
            }
            if (item.price.compareTo(leastExpensive.price) < 0) {
                leastExpensive = item;
            }
        }

        // --- КРАСИВЫЙ ВЫВОД ЧЕКА ---
        System.out.println("==================================================");
        System.out.printf("%-50s\n", "         ТОВАРНЫЙ ЧЕК / ОТЧЕТ ПО ПОКУПКАМ");
        System.out.println("==================================================");

        for (int i = 0; i < items.size(); i++) {
            Item item = items.get(i);
            // Если название слишком длинное, аккуратно подрезаем его для верстки
            String displayName = item.name.length() > 35 ? item.name.substring(0, 32) + "..." : item.name;
            System.out.printf("%2d. %-35s %8.2f руб.\n", (i + 1), displayName, item.price);
        }

        System.out.println("--------------------------------------------------");
        System.out.printf("%-38s %8d\n", "Всего позиций:", totalItems);
        System.out.printf("%-38s %8.2f руб.\n", "ИТОГО К ОПЛАТЕ:", totalPrice);
        System.out.println("--------------------------------------------------");
        System.out.printf("%-38s %8.2f руб.\n", "В том числе НДС (20%):", vatAmount);
        System.out.printf("%-38s %8.2f руб.\n", "Средняя стоимость товара:", averagePrice);
        System.out.println("--------------------------------------------------");
        System.out.printf("⭐ Самый дорогой товар: %s (%.2f руб.)\n", mostExpensive.name, mostExpensive.price);
        System.out.printf("🛒 Самый бюджетный товар: %s (%.2f руб.)\n", leastExpensive.name, leastExpensive.price);
        System.out.println("==================================================");
    }
}