2017-10-06 161 views
1

我有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

你必须使用扫描仪对该排?如果不是,请使用'String.split()'将行分解成单词。 –

+0

如果您必须为该行使用扫描仪,请勿使用'rowScanner.hasNextLine()';它只包含一行。使用'hasNext()'(和'next()')从行中获取单个单词。另外,如果你确定每一行总是有2个单词,你可以使你的结构成为'List '。 – DodgyCodeException

回答

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

如果你想绝对使用扫描仪:

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]+")); 
      } 
     } 
1

我的建议是不同的功能在不同的功能总是分开。该代码变得更容易阅读,更容易十个分量和可重复使用的

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

1

我扫描器的大风扇,但在这种情况下,您可以逐行读取并使用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); 
    }