2013-08-05 46 views
0

因此,我正在讀取4行單空格分隔數字的輸入文本文件。該文本文件只是:如何使用掃描儀從文本文件中檢測行尾

5 
9 6 
4 6 8 
0 7 1 5 

我想輸入這些數字到稱爲行的二維數組。因此,例如,rows[1][0]應該是9,即第二行中的第一個數字。

我的問題是,當我使用掃描儀對in.next()in.nextInt(),卻忽視了該行的結束,只是不斷下去,所以rows[0][1]最終被9,而不是0。如果該插槽沒有編號,我希望陣列完成填充0的填充。因此,由於第一行只有1號碼,5,我想要數組rows[0][0]5,但rows[0][1]rows[0][3]0

我試過使用try/catch NoSuchElementException和if if in.hasNextLine(),但這兩者似乎都不起作用。

任何想法或幫助將不勝感激。

+1

歡迎來到Stackoverflow。你可以請你發佈你的代碼嗎?我們很樂意幫助你 – Barranka

回答

3

使用多個掃描儀。一臺掃描儀獲取每行nextLine(),然後將獲取的行送入下一臺掃描儀,分析每行的標記。使用它時,一定要關閉內部掃描儀(和外部掃描儀)的()。

僞代碼:

create fileScanner with file 
while fileScanner has more lines 
    get next line from fileScanner 
    create new Scanner with next line, lineScanner 
    while lineScanner has next, 
    get next token. 
    do what you want with token. 
    close of lineScanner 
close fileScanner 
+0

@JasonC:哎呀!不知道我在想什麼。 'close()'是調用的正確方法。謝謝! –

5

可以使用掃描器讀取單獨的標記,你可以用掃描儀讀取整個行,但你不能用掃描儀一舉兩得。

你想要做的是首先讀取行成一個字符串,然後用掃描儀上的字符串解析該行,例如:What:

BufferedReader lineReader = new BufferedReader(...); 
String line; 

while ((line = lineReader.readLine()) != null) { 
    Scanner scanner = new Scanner(line); 
    // use scanner here 
} 

你也可以用掃描儀讀取行,而不是一個BufferedReader,但除非你有特定的要求(例如,你試圖把它放到已經使用掃描器的代碼中),那麼讀取這些行的方式並不重要。

希望有所幫助。

+0

1+。那可行。 –

0
Scanner scanner = new Scanner(
      "5\n9 6\n4 6 8\n0 7 1 5"); 

while (scanner.hasNextLine()) 
{ 
    String currentline = scanner.nextLine(); 

    String[] items = currentline.split(" "); 
    int[] intitems = new int[items.length]; 

    for (int i = 0; i < items.length; i++) 
    { 
     intitem[i] = Integer.parseInt(items[i]); 
    } 
} 
1

您應該使用BufferedReadersplit。這樣做的好處是,你知道有多大,讓您的陣列中的第二個維度爲split方法會返回一個數組,你可以檢查其length

public static void main(String[] args) throws Exception { 
    final String s = "5\n" 
      + "9 6\n" 
      + "4 6 8\n" 
      + "0 7 1 5"; 
    final InputStream is = new ByteArrayInputStream(s.getBytes()); 
    final int[][] array = new int[4][]; 
    try (final BufferedReader br = new BufferedReader(new InputStreamReader(is))) { 
     String line; 
     for (int i = 0; (line = br.readLine()) != null; ++i) { 
      final String[] tokens = line.split("\\s"); 
      final int[] parsed = new int[tokens.length]; 
      for (int j = 0; j < tokens.length; ++j) { 
       parsed[j] = Integer.parseInt(tokens[j]); 
      } 
      array[i] = parsed; 
     } 
    } 
    System.out.println(Arrays.deepToString(array)); 
} 

輸出:

[[5], [9, 6], [4, 6, 8], [0, 7, 1, 5]] 

由於數組不擴展,因此在while循環中不容易使用它們,您不知道它們的大小。使用split可讓您簡單地執行final int[] parsed = new int[tokens.length];,其中Scanner優於空白,您無法做到。

第一維尺寸是硬編碼,但如您所說的文件總是有4行。

+0

或者,您可以使用ArrayList或其他容器來提前必須知道令牌的數量。 –

+1

@JasonC當然,只是OP指定需要2d數組。我想總是也可以使用'List.toArray()',但這似乎有點浪費 - 在List和Array之間來回複製數據。 –