2017-10-16 36 views
0
BufferedReader in = new BufferedReader(new FileReader(file)); 
String line; 
int[] data = null; 

while((line = in.readLine()) != null) { 
    String[] a = line.split(","); //read in all numbers in file 
    data = new int[a.length]; //convert those numbers from Strings to ints 
    for(int i = 0; i < a.length; i++) { 
     data[i] = Integer.parseInt(a[i]); 
     System.out.print(data[i] + ","); //testing 
    } 
} 

System.out.println(); 
for(int i = 0; i < data.length; i++) { 

     System.out.print(data[i] + ","); 
} 

的文件只是包含1行由逗號分隔的數字,如組成:爲什麼讀取一行後數組的值會發生變化?

5,4, 
1,-1,-1,1,1, 
1,0,3,4,1, 
1,0,2,2,1, 
1,1,1,1,1, 

程序板條箱僅包含數字的字符串數組,然後創建以相同的順序的整數數組。但是將字符串更改爲整數,然後驗證int數組是否包含文件中的值,則輸出int數組。

該代碼輸出:

5,4,1,-1,-1,1,1,1,0,3,4,1,1,0,2,2,1,1,1,1,1,1, 
1,1,1,1,1, 

正如你可以看到數的第一行,其對應於當塊內的打印功能,打印正確。但是當數組迭代並在while塊之外再次打印時,突然間它完全不同了,爲什麼會出現這種情況?該數組應該在while塊外部相同。

+2

可以請您確認您的文件的內容。它看起來好像你在一條單獨的行上用'1,1,1,1,1'換行。這會導致一個問題,因爲每次讀取數據都會重新初始化數據。 –

+0

5,4, 1,-1,-1,1,1, 1,0,3,4,1, 1,0,2,2,1, 1,1,1,1,1 , –

+1

如果內容正是你剛發佈的內容,你會得到一個'NumberFormatException'。我已經試過你的代碼,並且它能正常格式化文本文件(單行,沒有額外的空白)。 –

回答

0

試圖修改你的問題,我看到你貼:

5,4, 
1,-1,-1,1,1, 
1,0,3,4,1, 
1,0,2,2,1, 
1,1,1,1,1, 

所以,我可以想像,你的文件是這樣。

如果執行此代碼:

BufferedReader in = new BufferedReader(new FileReader("Path_to/java.txt")); 
     String line; 
     int[] data = null; 

     while((line = in.readLine()) != null) { 
      String[] a = line.split(","); //read in all numbers in file 
      data = new int[a.length]; //convert those numbers from Strings to ints 
      System.out.println("1data.length: " + data.length); 
      for(int i = 0; i < a.length; i++) { 
       data[i] = Integer.parseInt(a[i]); 
       System.out.println(data[i] + ","); //testing 
      } 
     } 

     System.out.println("data.length: " + data.length); 
     for(int i = 0; i < data.length; i++) { 

      System.out.print(data[i] + ","); 
     } 

    } 

你可以看到data.length是5月末(出於明顯的原因)。這就是爲什麼在

for(int i = 0; i < data.length; i++) { 

     System.out.print(data[i] + ","); 
} 

你看

1,1,1,1,1, 
+0

是的,我想我現在明白了,在記事本上它看起來像1行的文本,但顯然有多行(你可以看到一個額外的空間在stackoverflow上,表示新行?) –

+0

我剛纔格式化您的問題 –

+0

@ApprentlyOk樂於幫助。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受:stackoverflow.com/help/someone-answers –

0

測試你的代碼,我發現它做工精細用正確格式的文本文件後。正確格式化爲單行,逗號分隔整數,沒有額外的白色間距。

您的程序

例有效文本文件:

5,4,1,-1,-1,1,1,1,0,3,4,1,1,0,2,2,1,1,1,1,1,1 

如果你在你的文件換行符,該陣列data將有一個新的數組等於當前分割線的長度重新初始化。因此,data將只包含最後一行讀取。

我提出作爲一個更好的解決方案使用List的,因爲整數的數量可能是未知的,並且Scanner讀取使用分隔符的文本文件「」。此外,在「掃描」文本文件的同時,刪除所有額外的空白區域,以防止在存在任何空白時使用Integer.valueOf()時發生NumberFormatException。這種方法將使讀取的文本文件不夠完整。請注意,如果文件不僅包含整數,這仍然會導致異常。

例如:

String fileName = "test.txt"; 
Scanner scanner = new Scanner(new File(fileName)); 
scanner.useDelimiter(","); 
List<Integer> result = new ArrayList<>(); 
while (scanner.hasNext()) { 
    // add the parsed integer to the list, removing split space. 
    result.add(Integer.valueOf(scanner.next().replaceAll("\\s+", ""))); 
} 

// Display contents 
String output = ""; 
for (int value : result) { 
    if (!output.isEmpty()) { 
     output += ", "; 
    } 
    output += value; 
} 
System.out.println(output); 
相關問題