#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