/
onequ1z
/
JavaCoursePaperTulSU
Обзор
Документация
Войти
/
onequ1z
/
JavaCoursePaperTulSU
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/ru/dmitry/montecarlo/util/ArgumentParser.java
166 строк
10 KB
tayno
fix: Исправлены грубые ошибки при рассчёте площади треугольника и прямоугольника. Подобраны максимально подходящие координаты для фигур ABCD и GEF. Исправлены тесты
08 дек 2025, 10:22
08 дек 2025, 10:22
dbf7c5e
Код
Авторство
О чём код?
package ru.dmitry.montecarlo.util; import java.util.ArrayList; import java.util.List; /** * Простой парсер аргументов командной строки. * Поддерживает следующие аргументы: * <ul> * <li>{@code --rect x0 y0 x1 y1} - границы прямоугольника</li> * <li>{@code --N VALUE} - одно значение N</li> * <li>{@code --Ns VALUES} - список значений N через запятую</li> * <li>{@code --seed VALUE} - seed для генератора случайных чисел</li> * <li>{@code --mode MODE} - режим работы (quick/experiment)</li> * <li>{@code --threads VALUE} - количество потоков для параллельного выполнения (по умолчанию: 1)</li> * <li>{@code --out FILE} - путь к файлу для экспорта результатов в CSV (только для experiment mode)</li> * <li>{@code --verbose} - включить подробное логирование</li> * <li>{@code --help, -h} - показать справку</li> * </ul> */ public class ArgumentParser { /** * Парсит массив аргументов командной строки и возвращает конфигурацию приложения. * * @param args массив аргументов командной строки * @return конфигурация приложения с установленными параметрами * @throws IllegalArgumentException если аргументы некорректны или отсутствуют обязательные параметры */ public static AppConfig parse(String[] args) throws IllegalArgumentException { AppConfig config = new AppConfig(); if (args == null || args.length == 0) { return config; // Возвращаем конфигурацию по умолчанию } int i = 0; while (i < args.length) { String arg = args[i]; if ("--rect".equals(arg)) { if (i + 4 >= args.length) { throw new IllegalArgumentException("--rect требует 4 аргумента: x0 y0 x1 y1"); } try { config.setRectX0(Double.parseDouble(args[i + 1])); config.setRectY0(Double.parseDouble(args[i + 2])); config.setRectX1(Double.parseDouble(args[i + 3])); config.setRectY1(Double.parseDouble(args[i + 4])); } catch (NumberFormatException e) { throw new IllegalArgumentException("--rect аргументы должны быть валидными числами: " + e.getMessage()); } i += 5; } else if ("--N".equals(arg)) { if (i + 1 >= args.length) { throw new IllegalArgumentException("--N требует 1 аргумент"); } try { config.setSingleN(Long.parseLong(args[i + 1])); } catch (NumberFormatException e) { throw new IllegalArgumentException("--N аргумент должен быть валидным целым числом: " + e.getMessage()); } i += 2; } else if ("--Ns".equals(arg)) { if (i + 1 >= args.length) { throw new IllegalArgumentException("--Ns требует 1 аргумент (список значений через запятую)"); } String[] nStrings = args[i + 1].split(","); List<Long> nValues = new ArrayList<>(); try { for (String nStr : nStrings) { nValues.add(Long.parseLong(nStr.trim())); } } catch (NumberFormatException e) { throw new IllegalArgumentException("--Ns аргументы должны быть валидными целыми числами: " + e.getMessage()); } if (nValues.isEmpty()) { throw new IllegalArgumentException("--Ns должен содержать хотя бы одно значение"); } config.setNValues(nValues); i += 2; } else if ("--seed".equals(arg)) { if (i + 1 >= args.length) { throw new IllegalArgumentException("--seed требует 1 аргумент"); } try { config.setSeed(Long.parseLong(args[i + 1])); } catch (NumberFormatException e) { throw new IllegalArgumentException("--seed аргумент должен быть валидным целым числом: " + e.getMessage()); } i += 2; } else if ("--mode".equals(arg)) { if (i + 1 >= args.length) { throw new IllegalArgumentException("--mode требует 1 аргумент"); } String mode = args[i + 1].toLowerCase(); if (!"quick".equals(mode) && !"experiment".equals(mode)) { throw new IllegalArgumentException("--mode должен быть 'quick' или 'experiment', получено: " + mode); } config.setMode(mode); i += 2; } else if ("--threads".equals(arg)) { if (i + 1 >= args.length) { throw new IllegalArgumentException("--threads требует 1 аргумент"); } try { int threads = Integer.parseInt(args[i + 1]); if (threads <= 0) { throw new IllegalArgumentException("--threads должен быть положительным числом"); } config.setThreads(threads); } catch (NumberFormatException e) { throw new IllegalArgumentException("--threads аргумент должен быть валидным целым числом: " + e.getMessage()); } i += 2; } else if ("--out".equals(arg)) { if (i + 1 >= args.length) { throw new IllegalArgumentException("--out требует 1 аргумент (путь к файлу)"); } config.setOutputFile(args[i + 1]); i += 2; } else if ("--verbose".equals(arg)) { config.setVerbose(true); i += 1; } else if ("--help".equals(arg) || "-h".equals(arg)) { printHelp(); System.exit(0); } else { throw new IllegalArgumentException("Неизвестный аргумент: " + arg); } } return config; } /** * Выводит справку по использованию программы в стандартный вывод. * Содержит описание всех доступных аргументов командной строки и примеры использования. */ public static void printHelp() { System.out.println("Приближённое вычисление площади методом Монте-Карло"); System.out.println(); System.out.println("Использование:"); System.out.println(" ./gradlew run [--args=\"ОПЦИИ\"]"); System.out.println(); System.out.println("Опции:"); System.out.println(" --rect x0 y0 x1 y1 Границы прямоугольника (по умолчанию: 0 0 10 10)"); System.out.println(" --N ЗНАЧЕНИЕ Одно значение N для быстрого режима (по умолчанию: 1000)"); System.out.println(" --Ns ЗНАЧЕНИЯ Значения N через запятую для режима экспериментов"); System.out.println(" Пример: --Ns 100,1000,10000"); System.out.println(" --seed ЗНАЧЕНИЕ Начальное значение генератора случайных чисел (опционально, случайное по умолчанию)"); System.out.println(" --mode РЕЖИМ Режим: 'quick' или 'experiment' (по умолчанию: quick)"); System.out.println(" --threads ЗНАЧЕНИЕ Количество потоков для параллельного выполнения (по умолчанию: 1)"); System.out.println(" --out ФАЙЛ Путь к файлу для экспорта результатов в CSV (только для experiment mode)"); System.out.println(" --verbose Включить подробное логирование (уровень FINE)"); System.out.println(" --help, -h Показать это сообщение справки"); System.out.println(); System.out.println("Примеры:"); System.out.println(" ./gradlew run"); System.out.println(" ./gradlew run --args=\"--mode experiment --Ns 100,1000,10000\""); System.out.println(" ./gradlew run --args=\"--N 50000 --seed 12345\""); System.out.println(" ./gradlew run --args=\"--rect 0 0 20 20 --verbose\""); System.out.println(" ./gradlew run --args=\"--N 1000000 --threads 4\""); System.out.println(" ./gradlew run --args=\"--mode experiment --Ns 1000,10000,100000 --seed 42 --out results.csv\""); } }