2016-04-19 98 views
1

經過一番努力(我是新手)後,我設法創建了一個讀取文本文件並將其放入多維數組的方法。然而,數組大小是硬編碼,它不處理空白行非常好,所以我有以下問題:如何使數組大小取決於文本文件的大小?

1)如何定義我的數組等於文本文件的大小?

2)有沒有簡單的方法來處理空行?理想情況下,我想刪除文本文件中的所有空白,以便數組不包含空值,但我願意提供處理它的最佳方法的建議。

這是我到目前爲止有:

public void TextFileReader(){ 

     String[][] textFileData = new String[5][2]; 

     InputStreamReader InputSR = null; 
     BufferedReader BufferedRdr = null; 
     String thisLine = null; 

     InputSR = new InputStreamReader(getResources().openRawResource(R.raw.text_file)); 
     BufferedRdr = new BufferedReader(InputSR); 

     try { 
      // open input stream text_file for reading purpose. 
      int i = 0; 
      while ((thisLine = BufferedRdr.readLine()) != null) { 
       String[] parts = thisLine.split(" "); 
       textFileData[i][0] = parts[0]; 
       textFileData[i][1] = parts[1]; 
       Log.v("String Array"+i+"0", String.valueOf(textFileData[i][0])); 
       Log.v("String Array"+i+"1", String.valueOf(textFileData[i][1])); 
       i = i +1; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
    } 
+0

爲什麼不使用動態的東西像[的ArrayList(https://docs.oracle.com/javase/7/docs/api/java/ util/ArrayList.html)在哪裏你不必擔心事先知道大小?如果*有*使用數組,我建議先通過迭代文件來計算行數。 – robotlos

+0

不,我不需要使用數組,但我不認爲ArrayList可能是一個多維數組列表?我想我可以只使用兩個ArrayLists? – Airfix

+0

你可以有一個ArrayList的數組。 – robotlos

回答

1

正如我在我的評論說,使用ArrayList在這種情況下,使事情變得更簡單,因爲你不必擔心手之前知道大小。你可以像這樣實現:

ArrayList<String[]> arrayList = new ArrayList<>(); 
try { 
    // open input stream text_file for reading purpose. 
    while ((thisLine = BufferedRdr.readLine()) != null) { 
     if (!thisLine.isEmpty()) { 
      String[] parts = thisLine.split(" "); 
      arrayList.add(parts); 
     } 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

請注意,我添加了以下條件:

if (!thisLine.isEmpty()) { 

這使得它,以便空行被跳過,不添加到ArrayList


,您可以通過它迭代就像您查看ArrayList的內容將數組:

for (String[] row : arrayList) { 
    System.out.println(Arrays.toString(row)); 
} 

或者像這樣:

for (int i = 0; i < arrayList.size(); i++) { 
    System.out.println(Arrays.toString(arrayList.get(i))); 
} 

我做了一個具有以下數據的虛擬文件:

line one 

line two 

line three 

注意每行之間的空行。打印ArrayList的導致內容:

[line, one] 
[line, two] 
[line, three] 

如果你真的想使用雙陣列,你可以通過文件迭代第一,算你有多少非空行一樣有你已經這麼做了(加入if (!thisLine.isEmpty()) {),然後像這樣對你的數組進行維度定位。


編輯
使用ArrayList,如果你想獲得第2行2列,你能做到這一點,像這樣(記住陣列開始在索引0):

String[] row = arrayList.get(1); 

將抓住你想要的行

String value = row[1]; 

將抓住你想要的行的列。

打印value出與System.out.println(value);單產:

或者你可以做一個行:

String value = arrayList.get(1)[1]; 

或者更好,但你可以創建一個方法,以便隨時調用它:

public static String getValue(ArrayList<String[]> arrayList, int row, int column) { 
    return arrayList.get(row)[column]; 
} 

,你可以調用像這樣:

String value = getValue(arrayList, 1, 1); 
+0

因此,如果我想引用(二)第二列中的第2行是否可以在ArrayList中做到這一點?我想,而不是像我以前那樣將數據解析成2列,並引用數組索引號我可以在時間將ArrayList行解析爲2列 – Airfix

+0

@Airfix,請參閱我上面的編輯解釋如何做到這一點 – robotlos

+1

感謝您的真正詳細的答案,這正是我正在尋找和細節幫助我作爲一個新手。我首先想到了,非常感謝你的幫助。 – Airfix

1

有爲什麼你需要使用一個數組一個特別的原因?出於這個原因,數組通常是不好的做法:它們有一個需要手動更改的靜態大小以避免溢出。實際上幾乎沒有人使用數組,除非有特殊需要。

更好的方法是查看動態更改其大小的其他容器,如Arraylist。您應該能夠創建具有相同效果的Arraylist Arraylist,但不提供數組的限制。

當編碼通常不嘗試重新發明輪子時,只需使用本機庫及其功能即可完成您想要的功能。

至於空白行,我假設當一個空行發生時,字符串被填充爲空,所以在這種情況下,你只需要檢查字符串是否爲空,然後填充你的容器無論您認爲適合哪種方式,或者如下面的海報所示,根本不要填充容器。

+0

ArrayList由數組支持 –

+0

除了我以外,使用數組而不是陣列列表的特殊原因並不足以理解數組列表可以爲我做些什麼。我走下陣列路徑,因爲我認爲我需要一個多維數組。我想我可以製作2個陣列列表(我的陣列的每個維度都有一個陣列列表),我不完全確定你的數組列表是什麼意思,你可以稍微詳細點說明嗎? – Airfix

2

對於數組大小問題,我建議使用ArrayList,因爲它是動態分配的,所以您不必確定大小,否則您將不得不計算文件中有多少行和多少個單詞。 對於空白行只是跳過就可以了:

while ((thisLine = BufferedRdr.readLine()) != null) { 
    if(!thisLine.trim().equals("")){ 
      String[] parts = thisLine.split(" "); 
      textFileData[i][0] = parts[0]; 
      textFileData[i][1] = parts[1]; 
      Log.v("String Array"+i+"0", String.valueOf(textFileData[i][0])); 
      Log.v("String Array"+i+"1", String.valueOf(textFileData[i][1])); 
      i = i +1; 
    } 
} 
相關問題