Отдельный текстовый файл с разделителями-запятыми в массив - PullRequest
0 голосов
/ 10 марта 2019

У меня есть текстовый файл с несколькими строками и 3 записями, разделенными запятыми в каждой строке.

Пример:

Советский Союз, Лариса_LATYNINA, 18
США, Michael_PHELPS, 16
Советский Союз, Николай_АНДРИАНОВ, 15

Я пытаюсь разделить их на 3 массива: 1 для страны, 1 для человека и 1 для медалей.

        ArrayList<String> country = new ArrayList<>();
        ArrayList<String> name = new ArrayList<>();
        ArrayList<Integer> medals = new ArrayList<>();
        java.io.File file = new java.io.File("Olympics.txt");
        Scanner input = new Scanner(file);
        input.useDelimiter(" , ");
        while(input.hasNext()) {
            country.add(input.next());
            name.add(input.next());
            medals.add(input.nextInt());
        }

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

Если я использую useDelimiter(","); вместо useDelimiter(" , ");, я получаю следующее исключение:

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at OlympicWinners.main(OlympicWinners.java:14)

Это ошибка, которую я получаю.Строка 14:

Medals.add(input.nextInt());

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Из вашего образца текста разделитель - это не запятая, окруженная пробелами (" , "), а просто запятая (",").Удалите эти пробелы, и вы должны быть в порядке:

input.useDelimiter(",");
0 голосов
/ 10 марта 2019

Пожалуйста, измените ваш код следующим образом:

public class Main {

    public static void main(String[] args) throws FileNotFoundException {
        ArrayList<String> country = new ArrayList<>();
        ArrayList<String> name = new ArrayList<>();
        ArrayList<Integer> medals = new ArrayList<>();
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader("F://test.txt"));
            String line = reader.readLine();
            while (line != null) {
                String[] lineParts = line.split(",");
                country.add(lineParts[0]);
                name.add(lineParts[1]); 
                medals.add(Integer.valueOf(lineParts[2]));
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(country);
        System.out.println(name);
        System.out.println(medals);

    }

}

В test.xml:

Soviet Union,Larisa_LATYNINA,18
United States,Michael_PHELPS,16
Soviet Union,Nikolay_ANDRIANOV,15

Вывод кода:

[Soviet Union, United States, Soviet Union]
[Larisa_LATYNINA, Michael_PHELPS, Nikolay_ANDRIANOV]
[18, 16, 15]
0 голосов
/ 10 марта 2019

Вы получаете InputMismatchException из-за последней строки input.nextInt() возвращает

"18 
United States"

Поскольку между 18 и United States (* есть разделитель строк \n) нет ,, каждый токен возвращается от разделителя к разделителю.

Вы должны прочитать все строки из файла и разделить их по разделителю:

List<String> lines = Files.readAllLines(Paths.get("Olympic.txt"));

for (String line : lines) {
    String[] fields = line.split(",");
    country.add(fields[0]);
    name.add(fields[1]);
    medals.add(Integer.valueOf(fields[2]));
}
...