2017-10-06 10 views
1

私は、たとえば、各行は二つの単語を含むファイルを、txtをしている:読むファイル、スキャナ

USA 321 
France 1009 
... 
Germany 902 

は、どのように私は2次元配列の言葉によって、このファイルを読むことができますか?

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

行にScannerを使用する必要がある場合は、 'rowScanner.hasNextLine()'を使わないでください。 1行しか含まれていません。 '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; 
} 

MyDataとして使用List<String>あなたがする必要がある場合)

+0

あなたに同意します。あなたのコードでは、メンテナンスと再利用性を高めるためにMyDataを1つだけ読み込む関数を追加する必要があります – Tuco

1

、しかし:コードは、を読むより簡単にmantain再利用可能なに容易になりますこの場合は、行ごとに読み取り、String.splitを使用して取得することができます。これはストリームを使って非常に簡単になります。

try (Stream<String> lines = Files.lines(Paths.get(FILENAME), UTF_8)) { 
     String[][] result = lines.map(s -> s.split("\\s+")) 
           .toArray(String[][]::new); 
    } 

をそれとも、ネストされたリストをしたい場合、あなたはこれを行うことができます:あなたは2次元配列に読み込むしたい場合は、これを行うことができます

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