#java
#java
Вопрос:
Я работаю над программой, которая считывает данные (типа string
и int
) из файла. Затем он создает объект с именем Person
и помещает его в ArrayList
. Для этой задачи я использую Scanner
.
С помощью таких методов, как next()
, nextLine()
, я могу читать / анализировать данные и создавать Person
; однако я действительно не знаю, как справиться с ситуацией, когда входные данные будут смешанными persons
.
В моей задаче указано, что может быть 2 варианта (ввод может включать):
- имя, год рождения
- или, имя, год рождения, карНаме и цвет (r, g,b)
Вариант 1: С next()
, nextLine()
я знаю (более или менее), как это сделать:
John 1980 Mercedes 255 255 102
- В
ArrayList
John должен выглядеть как[John 1980 Mercedes 255 255 102]
но я не знаю, что делать, когда ввод будет для ex.:
Вариант 2:
John 1980 Mercedes 255 255 102
Mary 1997
Alice 1993 Skoda 0 127 153
- В этой ситуации программа должна распознать, что у Мэри нет машины и в
ArrayList
. Мэри будет выглядеть как[Mary 1997 null]
Итак, класс Person
имеет 2 конструктора:
public Person(String name, int yearOfBirth, Car car)
и
public Person(String name, int yearOfBirth)
и Overrided toString()
метод.
Главная:
public class Main {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
File file = new File("file.txt");
Scanner sc;
try {
sc = new Scanner(file);
while (sc.hasNext()) {
// here, i think, i should create an Person and add 'him/her' to ArrayList<Person>
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println(list);
System.out.println("End of Program.");
}
}
Класс Person:
public class Person {
String name;
int yearOfBirth;
Car car;
public Person(String name, int yearOfBirth, Car car) {
super();
this.name = name;
this.yearOfBirth = yearOfBirth;
this.car = car;
}
public Person(String name, int yearOfBirth) {
super();
this.name = name;
this.yearOfBirth = yearOfBirth;
}
@Override
public String toString() {
return name " " yearOfBirth " " car;
}
Класс Car:
public class Car {
String nameCar;
Color color;
int r, g, b;
public Car(String nameCar, int r, int g, int b) {
this.nameCar = nameCar;
this.color = new Color(r, g, b);
this.r = r;
this.g = g;
this.b = b;
}
@Override
public String toString() {
return nameCar " " r " " g " " b;
}
}
Входные данные должны включать ArrayList
из Persons
Комментарии:
1. При использовании
nextLine
вы можете разделить извлекаемую строку, а затем проверить длину массива, который вы извлекаете изString::split
вызова.
Ответ №1:
для этого примера вы можете прочитать всю строку с помощью сканера, используя sc.nextLine()
(также используйте sc.hasNextLine()
в цикле while). Затем вы можете получить поля в массиве строк следующим образом:
String line = sc.nextLine();
String[] fields = line.split(" ");
//separate all the "words" in the string by a space character
После выполнения этого вы можете проверить, равна ли длина fields
массива 6 =, что означает, что у человека есть автомобиль или только 2.