See More

import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { ArrayList cars = new ArrayList<>(); Race race = new Race("24 часа Ле-Мана", 24, 3); Scanner usrInput = new Scanner(System.in); System.out.println("Добро пожаловать на одну из самых известных автогонок в мире — «" + race.getRaceTitle() + "»!"); System.out.println("Правила просты:\nНужно придумать " + race.getNumberOfCars() + " машины и столкнуть их в головокружительной " + race.getRaceTime() + "-часовой гонке!"); for (int i = 0; i < race.getNumberOfCars(); i++) { System.out.println(i + 1 + " машина: "); System.out.print("Введите название: "); String carName = checkUsrNameInput(usrInput, cars); System.out.print("Введите скорость (не может быть меньше 1 и больше 250 км/ч): "); int carSpeed = checkUsrSpeedInput(usrInput); Car car = new Car(carName, carSpeed); cars.add(car); } race.setCars(cars); //не знаю, правильно это или нет, может проще было бы использовать массив не из класса Race, а тот, который я создал в main System.out.println("Да начнется гонка!!!"); System.out.println("Выясняем победителя.."); Car fastestCar = race.calculateFastestCar(); System.out.println("Победитель: " + fastestCar.getName() + "!!!"); } private static String checkUsrNameInput(Scanner usrInput, ArrayList cars) { boolean isValid = false; String carName = null; while (!isValid) { carName = usrInput.nextLine(); if (carName.trim().isEmpty()) { System.out.print("Пустая строка, введите пожалуйста название автомобиля: "); } else if (isNumeric(carName)) { System.out.print("Название не должно состоять только из цифр, попробуйте еще раз: "); } else if (!isSpecialSymbols(carName)) { System.out.print("В названии не должно быть спец-символов, попробуйте еще раз: "); } else if (isCarNamesEquals(cars, carName)) { System.out.print("Машина с таким названием уже есть, введите другое: "); } else { isValid = true; } } return carName; } private static int checkUsrSpeedInput(Scanner usrInput) { boolean isValid = false; int carSpeed = 0; while (!isValid) { try { carSpeed = usrInput.nextInt(); usrInput.nextLine(); if (carSpeed > 0 && carSpeed <= 250) { isValid = true; } else { System.out.print("Скорость не может быть меньше 1 и больше 250 км/ч. Попробуйте еще раз: "); } } catch (Exception ex) { System.out.print("Некорректная скорость. Попробуйте еще раз: "); usrInput.nextLine(); } } return carSpeed; } //хотел сделать так, чтобы название не состояло только из цифр, но если ввести число, //которое не вмещает тип long, то проверка не срабатывает, хотелось бы понять как это обойти private static boolean isNumeric(String str) { try { Long.parseLong(str); return true; } catch (NumberFormatException e) { return false; } } private static boolean isSpecialSymbols(String str) { return str.matches("[a-zA-Zа-яА-Я0-9 ]+"); } private static boolean isCarNamesEquals(ArrayList cars, String carName) { boolean isEquals = false; if (!cars.isEmpty()) { for (Car car : cars) { if (car.getName().equals(carName)) { isEquals = true; break; } } } return isEquals; } }