逐字阅读,扫描仪

时间:2017-10-06 11:23:21

标签: java arrays file arraylist java.util.scanner

我有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()) {
        ...
    }
}

4 个答案:

答案 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);
    }