Получение «ошибки несоответствия» при сканировании файла и присвоение их массиву объектов - PullRequest
0 голосов
/ 11 мая 2019

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

    5
    Mary, 1010, 15
    Ben, 1119, 16
    Sam, 2278, 15
    Alex, 3245, 15
    Mia, 4448, 16

Я должен создать массив студенческих объектов, но я получаю «ошибку несоответствия», когда пытаюсь скомпилировать свой код.

Я попробовал следующее, но я не уверен, что мой код неправильный.

public class Classroom_Runner{
public static void main(String[] args)throws Exception{

File roster = new File("info.txt");
Scanner scanFile = new Scanner(roster);
Scanner scanInput = new Scanner(System.in);
//roster.split(", ");

//String insideFile = "";
int sizeClass = 0;
Classroom[] Students = new Classroom[0];

while(scanFile.hasNext()){
    sizeClass =scanFile.nextInt();
    String name = scanFile.next(); //<-- This would be line 35
    int ID = scanFile.nextInt();
    int age = scanFile.nextInt();

    Classroom student = new Classroom( name, age, ID);

}
    for(int i = 0; i<Students.length;i++){
            System.out.println(Students[i]);}
}
}

Фактический результат:

    Exception in thread "main" java.util.InputMismatchException
            at Classroom_Runner.main(Classroom_Runner.java:35)

но ожидаемый результат должен быть:

    Mary, 1010, 15
    Ben, 1119, 16
    Sam, 2278, 15
    Alex, 3245, 15
    Mia, 4448, 16

Ответы [ 3 ]

0 голосов
/ 11 мая 2019
        sizeClass =scanFile.nextInt();
        String name = scanFile.next(); 

        String temp = scanFile.next();
        temp = temp.substring(0, temp.length() -1);

        int realID = Integer.parseInt(temp);

        //rest of your code

Вы должны избавиться от запятой, чтобы поймать целые числа в нужном формате.

0 голосов
/ 11 мая 2019

Этого легко добиться, используя Files.lines() и потоки Java:

Classroom[] students = Files.lines(Paths.get("info.txt")).skip(1)
        .map(line -> line.split(", "))
        .filter(parts -> parts.length == 3)
        .map(parts -> new Classroom(parts[0], Integer.parseInt(parts[1]), Integer.parseInt(parts[2])))
        .toArray(Classroom[]::new);

Сначала вы прочитаете все строки (пропуская первую, вам это не нужно).Затем вы разделяете каждую строку на , на отдельные части.Для предотвращения IndexOutOfBoundException обрабатывают только линии из 3 частей.В конце вы сопоставляете каждую строку с вашим Classroom объектом и собираете все в массив.

Результат для предоставленного вами ввода будет следующим:

Classroom[name='Mary', age=1010, id=15]
Classroom[name='Ben', age=1119, id=16]
Classroom[name='Sam', age=2278, id=15]
Classroom[name='Alex', age=3245, id=15]
Classroom[name='Mia', age=4448, id=16]
0 голосов
/ 11 мая 2019

Это потому, что "1010" не является int из-за запятой ,, и поэтому следующая строка не запускается:

int ID = scanFile.nextInt();

Либо удалите запятые во входном файле, либо используйте next(), удалите запятую с помощью substring() и затем приведите ее к int.

Другим лучшим решением будет использование scanFile.nextLine() на каждой итерации, а затем получение различных значений в массив с String.split(", ") перед преобразованием тех, которые необходимо преобразовать в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...