Создать файл, содержащий сведения о рейсах автобусов и технического состояния. На java
Каждая запись содержит поля: номер рейса, пункт отправления, пункт назначения, время поездки, количество свободных мест, сведение о техническом состоянии. Количество записей произвольное. Написать программу, выводящую на экран следующую информацию: - список автобусов, у которых технические неисправности; - список автобусов с количеством свободных мест для указанного пункта назначения;
Я смог сделать только это. И как вывести мне 2 нижеследующих пункта? Я должен вывести его из файла?
BufferedReader br = null;
try{
File file = new File("Transport.txt");
if(!file.exists())
file.createNewFile();
PrintWriter pw = new PrintWriter(file);
pw.println("Номер рейса:");
pw.println("Пункт отправления:");
pw.println("Пункт назначения:");
pw.println("Время поездки:");
pw.println("Свободные места:");
pw.println("Техническое состояние:");
pw.close();
br = new BufferedReader(new FileReader("Transport.txt"));
String line;
while((line = br.readLine()) != null){
System.out.println(line);
}
}catch(IOException e){
System.out.println("Error: " + e);
}finally{
try{
br.close();
}catch(IOException e){
System.out.println("Error: " + e);`введите сюда код`
}
}
Ответы (1 шт):
Начну с главного - заканчивайте (а лучше не начинайте) писать процедурный код. Ваше описание задачи не очень конкретиезировано (например, в части вывода в файл непонятно, какой формат данных должен быть), но даже в этом случае вполне понятно, что у нас есть некая предметная область, которая представлена в данном случае одной сущностью, которая и должна описывать автобусные рейсы. Это значит, что для начала нам нужно создать класс, который будет хранить в себе всю необходимую информацию о автобусном рейсе. Выглядит это так:
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class BusFlight implements CsvStore{
private final static String DELIMITER = ";";
public final static String CONTENT = Stream.of("Номер рейса", "Пункт отправления",
"Пункт назначения", "Время поездки", "Свободные места", "Техническое состояние", "\r\n")
.collect(Collectors.joining(DELIMITER));
private Integer number;
private String source;
private String destination;
private Integer travelTimeMinute;
private Integer freePlace;
private Boolean technicalCondition;
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public Integer getTravelTimeMinute() {
return travelTimeMinute;
}
public void setTravelTimeMinute(Integer travelTimeMinute) {
this.travelTimeMinute = travelTimeMinute;
}
public Integer getFreePlace() {
return freePlace;
}
public void setFreePlace(Integer freePlace) {
this.freePlace = freePlace;
}
public Boolean getTechnicalCondition() {
return technicalCondition;
}
public void setTechnicalCondition(Boolean technicalCondition) {
this.technicalCondition = technicalCondition;
}
@Override
public String toCsv() {
final StringBuilder sb = new StringBuilder();
return sb.append(number).append(DELIMITER).append(source).append(DELIMITER)
.append(destination).append(DELIMITER).append(travelTimeMinute).append(DELIMITER)
.append(freePlace).append(DELIMITER).append(technicalCondition).append(DELIMITER).toString();
}
@Override
public String toString() {
return "BusFlights{" + "number=" + number + ", source=" + source + ", destination=" + destination +
", travelTimeMinute=" + travelTimeMinute + ", freePlace=" + freePlace + ", technicalCondition=" + technicalCondition + '}';
}
}
Разумеется, мы добавим геттеры и сеттеры, чтобы иметь доступ к нашим полям (методы equels, hashcode я не писал, т.к. в нашем случае пользы от них не будет, но по хорошему это делать надо всегда). Кроме, того мы переопределим метод toString, чтобы определить вид, в котором будет выводится информация о рейсе в консоль. И последнее, нам нужно не забыть о создании файла. Я выбрал csv-формат из-за простоты. Мы запишем все поля с разделителем ";". Это значит , что нам нужен метод который соберет информацию об своем рейсе в строку для нашего будущего csv. Отлично, добавим метод toCsv(). Наш класс готов, теперь мы имеем возможность создавать экземпляры этого класса, в которых и будет хранится информация о рейсах. Перейдем к фильтрации и записи. Поскольку в этом случае нам надо иметь дело не с одним объектом ранее созданного класса, а с множеством таких объектов, я создам класс-сервис, он должен уметь выводить в консоль переданный ему список объектов, выполняя фильтрацию по определенному условию, а также писать в файл в формате csv. Но я бы хотел иметь возможность переиспользовать свой класс-сервис для работы со списками других сущностей (моделей). Поэтому я имплементирую интерфейс для класса-модели с единственным методом - toCsv(), который уже реализован в моем классе-модели. Теперь я создаю класс-сервис и типизирую его дженериком, наследуемым от нашего интерфейса и реализую нужных мне 2 метода : вывод в консоль с фильтрацией и сохранения в csv. Теперь мой класс сервис может работать с любой моделью, которая будет имплементировать созданный мной интерфейс, а не только с классом BusFlight. Выглядит наш сервис довольно просто, а интерфейс еще проще:
@FunctionalInterface
public interface CsvStore {
public String toCsv();
}
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class BusFlightService <T extends CsvStore> {
public void filterAndPrint(List<T> busFlightsList, Predicate <T> predicate) {
busFlightsList.stream().filter(predicate).forEach(System.out::println);
}
public void writeToFile(String path, List<T> busFlightsList, String content) throws IOException {
String result = busFlightsList.stream().map(e -> e.toCsv()).collect(Collectors.joining("\r\n"));
Files.write(Paths.get(path), (content+result).getBytes());
}
}
Вот и все, теперь осталось откуда-то взять список рейсов. Я сгенерирую этот список, заполнив его случайными значениями, после чего передам мой список экземпляру класса-сервиса , который выведет мне в консоль нужную отфильтрованную информацию и сохранит все в файл. Выглядит это так:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.UUID;
public class Main {
private static final int NUMB_BUS_FLIGHTS = 50;
private static final int FREE_PLACES = 5;
private static final String FILE_NAME = "Transport.txt";
public static void main(String[] args) throws IOException {
//создаем список рейсов и заполняем его случайными значениями
List<BusFlight> busFlightsList = new ArrayList<>(NUMB_BUS_FLIGHTS);
for (int i = 0; i < NUMB_BUS_FLIGHTS; i++) {
BusFlight busFlights = new BusFlight();
busFlights.setNumber(i);
busFlights.setSource(UUID.randomUUID().toString());
busFlights.setDestination(UUID.randomUUID().toString());
busFlights.setTravelTimeMinute(randomGenerator(15, 180));
busFlights.setFreePlace(randomGenerator(0, 50));
busFlights.setTechnicalCondition(randomGenerator(0, 1) == 0);
busFlightsList.add(busFlights);
}
//создаем экземпляр сервисногшо класса для работы со списками рейсов
BusFlightService <BusFlight> busFlightService = new BusFlightService();
//выводим списки с фильтрацией (тех.неисправные и с определенным количеством свободных мест)
System.out.println("СПИСОК РЕЙСОВ, ГДЕ У АВСТОБУСОВ ЕСТЬ ТЕХ.НЕИСПРАВНОСТИ");
busFlightService.filterAndPrint(busFlightsList, bus -> !bus.getTechnicalCondition());
System.out.println("**************************************************");
System.out.println("СПИСОК РЕЙСОВ, ГДЕ КОЛИЧЕСТВО СВОБОДНЫХ МЕСТ " + FREE_PLACES);
busFlightService.filterAndPrint(busFlightsList, bus -> bus.getFreePlace() == FREE_PLACES);
System.out.println("**************************************************");
//записываем список всех рейсов в файл
busFlightService.writeToFile(FILE_NAME, busFlightsList, BusFlight.CONTENT);
}
private static int randomGenerator(int min, int max) {
Random rnd = new Random(System.currentTimeMillis());
return min + rnd.nextInt(max - min + 1);
}
}
Удачи , если есть вопросы - пишите, постараюсь ответить.