Мой код читает в последней переменной в строке и первой переменной в следующей строке (в текстовом файле) как один элемент? - PullRequest
2 голосов
/ 29 апреля 2019

Это (название) происходит по какой-то причине.

У меня есть такой текстовый файл:

5
H  H  H  H  H
V  H  H  H  H
H  X  X  X  X
H  D  H  H  H
H  H  H  H  X

Я проанализировал файл с

input.useDelimiter(" ");

Я прочитал и храню число в строке 1 в переменной с именем "size"

Затем я приступил к чтению файла с вложенным циклом и сохранил элементы в двумерном массиве:

    for(int x = 0; x < size; x++) {
        for (int y = 0; y < size; y++) {
            maze[x][y] = input.next();
            System.out.print(maze[x][y] + " ");
        }
    }

По какой-то причине последний элемент строки и первый элемент следующей строки всегда читаются вместе с новой строкой между ними. Так что maze[0][4] хранит H\nV, когда предполагается хранить только H.

Я понятия не имею, почему это происходит.

РЕДАКТИРОВАТЬ: я заметил, что проблема исчезает после добавления пробела в конце каждой строки в текстовом файле, но есть ли способ решить эту проблему без изменения файла?

1 Ответ

2 голосов
/ 29 апреля 2019

Ваш входной разделитель - пробел. Когда ваш файл разделен, он разделяет все фактические пробелы как разделители и обрезает их. Но символ перевода строки (в зависимости от используемой ОС / кодировки) интерпретируется как то, что он есть, а не как пробел.

Вы можете записать все элементы в одну строку и проанализировать файл как oneliner, или, что еще лучше, вы можете сначала разбить файл на строки (разделитель "\ n" или "\ r" или любой другой), а затем разделить его пробелами. Тем не менее, мое goto было бы совпадением регулярных выражений, потому что те делают хорошую работу в этом отношении.

Pattern pattern = Pattern.compile("[^\\h\\v]+");
Matcher matcher = pattern.matcher(input); // cut the matrix size before you do this!
int x = 0;
int y = 0;
while (matcher.find()) {
    String match = matcher.group(0);
    maze[x][y] = match;
    ++y;
    if (y == size) {
        ++x;
        y = 0;
    }
}

Шаблон [^\\v\\h]+ захватывает все, что не является пробелом или разрывом строки (не вертикальным или горизонтальным пробелом). Другими словами, он разбивает вашу строку на то, что вы хотите, чтобы она была разбита. Однако сопоставление регулярных выражений работает немного иначе, чем split. Это позволяет вам интерпретировать каждое совпадение индивидуально, даже с подстроками в вашем сопоставлении, если вы определяете их в выражении. https://www.vogella.com/tutorials/JavaRegularExpressions/article.html

...