我有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()) {
...
}
}
答案 0 :(得分:2)
假设您的代码正常工作,我会这样做。
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]));
}
这将获取当前行并将其拆分为空格字符。 然后,它会创建一个包含两个元素的列表,并将其添加到您的临时列表
答案 1 :(得分: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]+"));
}
}
答案 2 :(得分:1)
我的建议是始终将不同功能的不同功能分开。代码变得更容易读取,更容易 mantain 和可重用:
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
)
答案 3 :(得分:1)
我是Scanner的忠实粉丝,但在这种情况下,您可以逐行阅读并使用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);
}