我正在阅读一个16x16数独谜题格式的文本文件。
例如:
F7B-E-A-1--6---D -91AF-0-85D7E4-C 05-69C---B-EA-3- -C-E-2-B--A-7860 E05---2F-7---1C- -4-8-DC--E-593-- -29---1-D--A-04- D67-A-98----B-F- 9B-D-130C8--F5A- 8F4569EA7D--CB-- 6A---745BFE-12D9 7--1DBFC-A-04--E 5-F9C-61240D-7E- A--7-F-DE-580-2- --0-5E7-F63C--14 CE640-----7B5D9F
我正在尝试将值放入2D char数组中,但是当遇到行的末尾时,似乎包含3个空格。 我尝试过使用BufferedReader和FileInputStream等各种方法无济于事。文本文件必须采用该格式,因为我的教授将使用该格式使用自己的值进行测试。
我将文件放入ArrayList的代码:
private static ArrayList readFile(File filename)
{
ArrayList records = new ArrayList();
try
{
FileInputStream stream = new FileInputStream(filename);
char current;
while(stream.available() > 0)
{
current = (char)stream.read();
records.add(current);
}
stream.close();
return records;
}
catch (Exception e)
{
System.err.format("Exception occurred trying to read '%s'.", filename);
return null;
}
}
然后我使用迭代器开始为2D数组赋值。当打印出网格时看起来很好,但是在检查单个值时,比如grid [1] [1],由于它投入的间距,它不正确。
有没有办法用char读取char,但是避免使用3个空格来表示新行?
答案 0 :(得分:3)
您提到要放入2D字符数组,因此您可能希望忽略位置> 15:
GlobalDataMethods
现在你的2d数组会自动忽略那些空白,因为你逐行读入文件,然后手动将值添加到2d数组中。
答案 1 :(得分:2)
好吧,既然你只对十六进制字符和-
真正感兴趣,你可以只过滤其他所有内容。最简单的方法可能是取代:
current = (char)stream.read();
使用:
current = (char)stream.read();
while ("0123456789ABCDEF-".indexOf(current) < 0)
current = (char)stream.read();
但您可能需要摆弄错误条件以确保其防弹。
例如,检查输入循环结束后添加到records
的元素数量。如果records.size()
没有给你256,那么该文件就有问题。
这会从文件中删除所有格式问题,只有内容才会重要(例如,如果需要,您可以在一行中提供所有256个字符)。
这符合健全性原则,&#34;在你所接受的内容中是自由的,具体在你所生产的内容中。&#34;
您可能还想重新考虑从文件输入创建数组列表的方法,然后从中构建二维数组。在我看来,你可以直接用(伪代码):
之类的东西创建2D数组def readPuzzle(file) -> (array, error)
set puzzle to new char[16][16]
set row to 0, col to 0
get next character from file to current
while read okay:
if current in "0123456789ABCDEF-":
if row is 16:
return (puzzle, "too many entries in file")
puzzle[row][col] = current
increment col
if col is 16:
increment row
set col to 0
if row is not 16:
return (puzzle, "not enough entries in file")
return (puzzle, "okay")
这基本上只是从文件中读取所有字符,如果它们有效,则将它们直接添加到数组中。在添加之前,它会检查以确保您尚未填充拼图,并且在处理完所有字符后,它会检查以确保整个拼图已填充。
答案 2 :(得分:1)
String.trim()
是从字符串的开头或结尾删除不必要的空格的最简单方法,因此您可以在读取文件后始终只执行清理过程:
private static void trimAllStrings(List<String> list) {
for (int i = 0; i < list.size(); i++) {
list.put(i, list.get(i).trim());
}
}
或者你可以在阅读内容时进行修剪 - Java 8的Files.lines()
流使这种转换变得非常简单:
List<String> trimmedLines = Files.lines(myfile, StandardCharsets.UTF_8)
.map(String::trim).collect(Collectors.toList());
如果你还没有使用这种Java 8语法,你可以用Java 7风格做同样的事情:
ArrayList<String> list = new ArrayList<>();
for (String line : Files.readAllLines(myfile, StandardCharsets.UTF_8)) {
list.add(line.trim());
}