这个(标题)出于某种原因而发生。
我有一个这样的文本文件:
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