读取文件,扫描仪
问题描述:
我有txt文件,其中每行包含两个词,例如:读取文件,扫描仪
USA 321
France 1009
...
Germany 902
我怎样才能读取这个文件通过文字在二维数组?我有:
List<List<String>> temps = new ArrayList<>();
Scanner dataScanner = new Scanner(dataFile);
while (dataScanner.hasNextLine()) {
Scanner rowScanner = new Scanner(dataScanner.nextLine());
temps.add(new ArrayList<>(2));
while (rowScanner.hasNextLine()) {
...
}
}
答
我会做这样的假设你的代码工作
List<List<String>> temps = new ArrayList<>();
Scanner dataScanner = new Scanner(dataFile);
while (dataScanner.hasNextLine()) {
String[] data = dataScanner.nextLine().split(" ");
temps.add(new ArrayList<>(Arrays.asList(data[0],data[1]));
}
这需要当前行,并在空格字符将其分解。 此后,它创建了两个元素的列表,并把它添加到您的临时工列表
答
如果你想绝对使用扫描仪:
List<List<String>> temps = new ArrayList<>();
Scanner dataScanner = new Scanner("a b\nc d\ne f\n");
while (dataScanner.hasNextLine()) {
Scanner rowScanner = new Scanner(dataScanner.nextLine());
List<String> datas=new ArrayList<>(2);
temps.add(datas);
while (rowScanner.hasNext("[^\\s]+")) {
datas.add(rowScanner.next("[^\\s]+"));
}
}
答
我的建议是不同的功能在不同的功能总是分开。该代码变得更容易阅读,更容易十个分量和可重复使用的:
public static List<String> readFileLineByLine(String file) {
List<String> lines = new ArrayList<>();
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
temps.add(scanner.nextLine());
}
return lines;
}
public static List<MyData> parseLines(List<String> lines) {
List<MyData> list = new ArrayList<>();
for (String line : lines) {
String[] data = line.split(" ");
list.add(new MyData(data[0], data[1]));
}
return list;
}
(使用List<String>
为MyData
如果需要)
+0
同意你的意见。在你的代码中,我应该添加一个函数来只读取一个MyData以增加可维护性和可重用性 – Tuco
答
我扫描器的大风扇,但在这种情况下,您可以逐行读取并使用String.split
。这使用流变得非常简单。如果你想读入一个二维数组,你可以这样做:
try (Stream<String> lines = Files.lines(Paths.get(FILENAME), UTF_8)) {
String[][] result = lines.map(s -> s.split("\\s+"))
.toArray(String[][]::new);
}
或者,如果你想嵌套列表,你可以这样做:
try (Stream<String> lines = Files.lines(Paths.get(FILENAME), UTF_8)) {
List<List<String>> result = lines.map(s -> s.split("\\s+"))
.map(Arrays::asList)
.collect(toList());
System.out.println(result);
}
你必须使用扫描仪对该排?如果不是,请使用'String.split()'将行分解成单词。 –
如果您必须为该行使用扫描仪,请勿使用'rowScanner.hasNextLine()';它只包含一行。使用'hasNext()'(和'next()')从行中获取单个单词。另外,如果你确定每一行总是有2个单词,你可以使你的结构成为'List'。 –
DodgyCodeException