Загрузка данных
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ShoppingListScanner {
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 fileName = "shopping_list.txt";
// 1. Создаем тестовый файл (для демонстрации, чтобы код работал сразу)
createTestFile(fileName);
List<Item> items = new ArrayList<>();
BigDecimal totalPrice = BigDecimal.ZERO;
// 2. Используем Scanner для чтения созданного файла
File file = new File(fileName);
// try-with-resources автоматически закроет Scanner после выполнения программы
try (Scanner scanner = new Scanner(file, "UTF-8")) {
// Построчно читаем файл до самого конца
while (scanner.hasNextLine()) {
String line = scanner.nextLine().trim();
// Пропускаем пустые строки, если они есть в файле
if (line.isEmpty()) {
continue;
}
// Находим последний пробел для разделения названия и цены
int lastSpaceIndex = line.lastIndexOf(" ");
if (lastSpaceIndex != -1) {
String name = line.substring(0, lastSpaceIndex).trim();
String priceStr = line.substring(lastSpaceIndex + 1).trim();
try {
BigDecimal price = new BigDecimal(priceStr);
items.add(new Item(name, price));
totalPrice = totalPrice.add(price);
} catch (NumberFormatException e) {
System.out.println("❌ Ошибка чтения цены в строке: \"" + line + "\"");
}
}
}
} catch (IOException e) {
System.out.println("❌ Не удалось прочитать файл: " + e.getMessage());
return;
}
// 3. Расчет аналитики и вывод чека (если файл не был пустым)
int totalItems = items.size();
if (totalItems == 0) {
System.out.println("⚠ Файл прочитан, но список покупок пуст!");
return;
}
BigDecimal averagePrice = totalPrice.divide(BigDecimal.valueOf(totalItems), 2, RoundingMode.HALF_UP);
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", " ЧЕК ИЗ ФАЙЛА: " + fileName);
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("==================================================");
}
// Вспомогательный метод для автоматического создания текстового файла
private static void createTestFile(String fileName) {
try (FileWriter writer = new FileWriter(fileName, false)) {
writer.write("Молоко цельное пастеризованное 89.90\n");
writer.write("Хлеб Бородинский нарезка 45\n");
writer.write("Кофе в зернах Арабика 100% 1250.55\n");
writer.write("Шоколад горький 99.9% 149.00\n");
writer.write("Сыр Пармезан выдержанный 450.25\n");
System.out.println("💾 Файл '" + fileName + "' успешно создан/обновлен для теста.\n");
} catch (IOException e) {
System.out.println("Не удалось создать тестовый файл: " + e.getMessage());
}
}
}