Получить входные данные из файла и поместить их в set, Java

#java #file

#java #файл

Вопрос:

В моей задаче мне нужно сохранить класс Car в setOfCars. Чтение должно выполняться из файла. У меня есть id, nameOfCar, noOfSeats.

Ввод:

1
Mercedes
GTR 2

В основном у меня есть это:

 Set<Car> listOfCars= eneterCars();
 

Но intellij привел его к:

  Set<Cars> listOfCars= (Set<Car>) eneterCars();
 

И это не работает.

Метод, который я вызываю, также находится в main:

   File cars= new File("dat/cars.txt");

try(FileReader fileReader = new FileReader(cars);
    BufferedReader reader = new BufferedReader(fileReader)){
    String readLine;
    List<Car> listOfCars= new ArrayList<>();
    while((readLine= reader.readLine()) != null){
        Long id = Long.parseLong(readLine);
        String name= reader.readLine();
        Integer noOfSeats=Integer.parseInt(reader.readLine());
        listOfCars.add(new Car(id, name, noOfSeats));
        //System.out.println(id   " name"   name  " "   noOfSeats);
    }

return cars;
 

Я хочу сохранить информацию из файла в set, чтобы я мог использовать ее позже. Но я получаю эту ошибку приведения при вызове этой функции.

Комментарии:

1. return cars на самом деле возвращает файл, а не список.

Ответ №1:

Вы написали

 return cars;
 

что есть File cars= new File("dat/cars.txt"); . Вам нужно вернуть правильный объект как

 return listOfCars;
 

Кроме того, вместо объявления List<Car> listOfCars= new ArrayList<>(); в методе вы могли бы объявить его так, как Set<Car> listOfCars= new LinkedHashSet<>(); если бы вам нужно было a Set вместо a List .

Если вы все еще хотите сохранить объявление таким, какое оно есть, идиоматический способ преобразовать его в Set следующий:

 Set<Cars> listOfCars= new LinkedHashSet<>(eneterCars());
 

Примечание: LinkedHashSet сохраняется порядок вставки. Если порядок вставки для вас не имеет значения, вы можете использовать HashSet .

Комментарии:

1. Спасибо, это помогло!

2. Спасибо, я это сделал

Ответ №2:

 public final class Car {

    private final int id;
    private final String manufacture;
    private final String model;

    public Car(int id, String manufacture, String model) {
        this.id = id;
        this.manufacture = manufacture;
        this.model = model;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!(obj instanceof Car))
            return false;
        return id == ((Car)obj).id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
 

 public static Set<Car> readCarsFromFile(File file) throws IOException {
    try (Scanner scan = new Scanner(file)) {
        Set<Car> cars = new LinkedHashSet<>();

        while (scan.hasNext()) {
            int id = scan.nextInt();
            scan.nextLine();
            String manufacture = scan.nextLine();
            String model = scan.nextLine();
            cars.add(new Car(id, manufacture, model));
        }

        return cars;
    }
}
 

cars.txt

 1
Mercedes
GTR 2
2
BMW
X5
 

ДЕМОНСТРАЦИЯ:

 Set<Car> cars = readCarsFromFile(new File("dat/cars.txt"));
// 2 cars: Mersedes, BMW