我的代码是将行中的最后一个变量和下一行(在文本文件中)中的第一个变量作为单个元素读取?



这个(标题)出于某种原因而发生。

我有一个这样的文本文件:

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"的变量中

然后我继续使用嵌套循环读取文件并将元素存储在 2D 数组中:

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]存储HnV,当它只应该存储H时。

我不知道为什么会发生这种情况。

编辑:我注意到在文本文件中每行的末尾添加一个空格后问题消失了,但是有没有办法在不更改文件的情况下解决此问题?

您的输入分隔符是一个空格。拆分文件时,它会将所有实际空格拆分为分隔符并剪切它们。但是换行符(取决于您使用的任何操作系统/编码)被解释为它是什么,而不是空格。

您可以将所有元素写入一行并将文件解析为一行,或者更好的是,您可以先按行拆分文件(分隔符""或"\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]+捕获任何非空格或换行符(非垂直或水平空格)。换句话说,它按您希望拆分的内容拆分字符串。但是,正则表达式匹配器的工作方式与拆分略有不同。如果您在表达式中定义它们,它允许您单独解释每个匹配项,即使匹配项中的子字符串也是如此。https://www.vogella.com/tutorials/JavaRegularExpressions/article.html

相关内容

  • 没有找到相关文章

最新更新