2015-09-22 78 views
0

希望你能幫上忙。仍然試圖讓我的頭轉向Java!將.txt文件的內容讀入2D字符串ARRAYLIST

我有一個文本文件的內容我想存儲(並在以後使用)到一個2D數組列表中。 文本文件例子是這樣的(條目數量不確定的不確定行數):

狗,貓,猴子,大象
芯片,香腸,豆子,鼠標,螞蟻
任何東西,不管一些對象,不知道,每一行都有不同,數值的

我希望能夠打印出的文本文件,只是因爲它有整齊地存放在我的二維數組列表中的項目,但站(BID)
如:

狗|貓|大象|
芯片|香腸|豆類|小鼠|螞蟻|
任何東西|任何|一些對象| dunno |每一行都有不同的數值|

但是當我運行下面的程序,我得到:

山坳是15
狗|貓|猴子|大象|芯片|香腸|豆|鼠標|螞蟻|什麼|什麼|一些對象|說不上|每行都有不同的數值|
狗|貓|大象|薯片|香腸|豆類|鼠標|螞蟻|任何東西|任何|一些對象| dunno |每一行都有不同的數值|
狗|貓|大象|薯片|香腸|豆類|鼠標|螞蟻|任何東西|任何|一些對象| dunno |每一行都有不同的數值|

即,txt文件中的每一行(在這種情況下有3個)似乎在包含txt文件中所有行的biD結構中產生一個條目。 真的,每個打印的行應該只包含一行來自txt文件的項目。

下面是代碼:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Scanner; 

public class testData { 

    private static Scanner file; 
    static int rows; 

    public static void main(String[] args) throws FileNotFoundException { 
     ArrayList<ArrayList<String>> biD = new ArrayList<ArrayList<String>>(); 
     file = new Scanner(new File("C:/tmp/text.txt")); 
     ArrayList<String> line = new ArrayList<String>(); 

     while (file.hasNextLine()) { 
      final String nextLine = file.nextLine(); 
      final String[] items = nextLine.split(","); 

      for (int i = 0; i < items.length; i++) { 
       line.add(items[i]); 
      } 

      biD.add(line); 
      rows++; 
      Arrays.fill(items, null); // to clear out the 'items' array 
     } 

     int col = biD.get(0).size(); 
     System.out.println("col is " + col); 

     for (int i = 0; i < rows; i++) { 
      for (int j = 0; j < biD.get(i).size(); j++) { 
       System.out.print(biD.get(i).get(j) + "|"); 

      } 
      System.out.println(); 
     } 

    } 

} 

所以基本上我的出價結構似乎是儲存過多的信息。

所以一個walkthough(我認爲)應該是:

從文件中讀取一行
店的字符串(nextLine)在
分割字符串,並存儲在一個字符串數組中的項目(項目)
將項目添加到陣列列表(行)
將arraylist添加到陣列列表biD。
(這是我要去哪裏錯了,我想,也許不理解如何的ArrayList做工正確,我認爲!)

任何想法,任何人?

謝謝。

回答

0

行變量聲明一次,並寫入到每次你得到一個新的時間線中移動這一點。聲明語句必須在while循環中移動,因此會爲每一個新行創建一個新語句。

public static void main(String[] args) throws FileNotFoundException { 
    ArrayList<ArrayList<String>> biD = new ArrayList<ArrayList<String>>(); 
    file = new Scanner(new File("C:/tmp/text.txt")); 
    //ArrayList<String> line = new ArrayList<String>(); <-- Move down to 

    while (file.hasNextLine()) { 

     ArrayList<String> line = new ArrayList<String>(); <-- Down here  
     final String nextLine = file.nextLine(); 
     final String[] items = nextLine.split(","); 

     for (int i = 0; i < items.length; i++) { 
      line.add(items[i]); 
     } 

     biD.add(line); 
     rows++; 
     Arrays.fill(items, null); // to clear out the 'items' array 
    }... 
+0

簡直不敢相信這就是它!非常感謝,埃裏克(和塞內克)! –

1

您需要爲每行添加一個List的新實例。

在你的代碼中,你在每一行中放置完全相同的列表實例,這將導致所有行都相同。

所以while循環

ArrayList<String> line = new ArrayList<String>();