Для каждой загруженной строки (из файла со смешанными строками и целыми числами) Создайте объект типа Person

#java

#java

Вопрос:

Я работаю над программой, которая считывает данные (типа string и int ) из файла. Затем он создает объект с именем Person и помещает его в ArrayList . Для этой задачи я использую Scanner .

С помощью таких методов, как next() , nextLine() , я могу читать / анализировать данные и создавать Person ; однако я действительно не знаю, как справиться с ситуацией, когда входные данные будут смешанными persons .

В моей задаче указано, что может быть 2 варианта (ввод может включать):

  1. имя, год рождения
  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.