2015-06-24 88 views
0

我必須導入包含單詞和整數的文本文件,然後使用二維數組維護數據。我似乎無法弄清楚如何製作這個數組。我只能使用Scanner,File和FileNotFoundException。這裏是我的代碼的片段:在java中爲文本文件創建一個二維數組?

public static void DisplayInventory() throws FileNotFoundException 
{ 

    try 
    { 
     Scanner autoInventory = new Scanner(new File("records.txt")); 

     for (int Num = 0; Num < 15; Num++) 
     { 
      String autoRecords = autoInventory.nextLine(); 
      autoRecords = autoRecords.replace(';', ' '); 
      System.out.println(autoRecords); 

     } 

    } 
    catch (FileNotFoundException except) 
    { 
     System.out.println("Error: Inventory read failure. Error " + 
      except.getMessage()); 
     System.exit(-1); 

    } 

} 

正如你所看到的,這不顯示數組。我不確定如何做到這一點,並已在這幾天。我是java的新手,這是一項任務。我很感激你能給予的幫助。

+3

您能告訴我們輸入'records.txt'文件的結構嗎? –

+0

是的,它是一個14行7列的文本文件,具有不同類型的食物,屬性和定價。 – Paul

+1

@Paul將文本文件的實際內容作爲您的問題的一部分包含在內。 – Gosu

回答

0

我不完全知道你在做什麼或爲什麼你需要一個二維數組,但這裏是你將如何創建一個數組和一個二維的,以及如何添加數據到他們與一個for循環。但是,我不認爲你需要一個二維數組。

public static void DisplayInventory() throws FileNotFoundException 
{ 
String[] sArray = new String[15]; //I'm assuming there are 15 values being added 
String[][] sArray2 = new String[10][10]; //Not sure how many are being added 
//Remember, make sure you don't use less space than you need. 

    try 
    { 
     Scanner autoInventory = new Scanner(new File("records.txt")); 

     for (int Num = 0; Num < 15; Num++) 
     { 
      String autoRecords = autoInventory.nextLine(); 
      autoRecords = autoRecords.replace(';', ' '); 
      sArray[Num] = autoRecords; 
      System.out.println(sArray[Num]); 
     } 

我認爲這應該夠了,因爲我不相信你需要一個二維數組;看起來你想要做的事情可以用普通數組來管理。這就是說,我還沒有完全意識到你要做什麼,所以如果你真的需要使用二維數組,那麼只需添加另一個for循環,並且在使用數組時,您可能會可能 (不一定)需要保持第一的價值循環的第一架內,並嵌套在第二個 - 這樣的:

sArray2[Num][Num2]; 
+0

這個答案也適用!有一件事,文本文件的第一行有一個14和7,代表文檔的行數和列數,打印時我該如何擺脫它? – Paul

+0

很高興我能幫到你。 至於如何擺脫這一點,我建議要麼直接在文本文件中編輯它,要麼使用一些字符串方法(http://docs.oracle.com/javase/7/docs/api/java/ lang/String.html)。我可能會在檢查數字是否存在(.contains())的情況下做一些事情,然後使用replace()方法替換它。從那裏,根據字符串本身 - 如果你在乎空間 - 我會建議使用trim()方法。讓我知道如果這就是你想要的。 – InsertHandleHere

+0

是的,我不能編輯文本文件,但我可以使用字符串方法。另外,如何爲二維數組添加另一個循環?我會刪除第一個sArray嗎? – Paul

1

我要做出一些假設(可能不準確)。第一個是你的文件看起來像這樣(以CSV 14行7列):

a1,b1,c1,d1,e1,f1,g1 
a2,b2,c2,d2,e2,f2,g2 
a3,b3,c3,d3,e3,f3,g3 
a4,b4,c4,d4,e4,f4,g4 
.. 

下一個假設是,你的文件包含String類型的值。之前,我們做任何事情,我們需要聲明的二維數組:

int numRecords = 14; 
int numColumns = 7; 
String[][] records = new String[numRecords][numColumns]; 

您發佈試圖讀取從掃描儀15行的代碼,做了上;更換(不知道那是一回事),並打印線。這是一個好的開始 - 這個循環負責讀取每一行。我還會添加一個附加條件,檢查是否確實存在下一行(使用hasNextLine)。

for (int i = 0; i < numRecords && autoInventory.hasNextLine(); i++) 
{ 
    String rowData = autoInventory.nextLine(); 
    String[] colData = rowData.split(","); 

    for (int j=0; j<colData.length && j<numColumns; j++) 
    { 
     records[i][j] = colData[j]; 
    } 
} 

這裏面外環我們使用nextLine收集rowData開始。接下來,我們使用split(字符串上的一個函數)將行分成多個部分(由,定界),將這些部分存儲在一維數組中。我們聲明第二個循環(內部循環),循環遍歷colData - 對於我們檢查的每個值,我們將它放入records數組中的適當位置。

現在文件已被讀入陣列,您可以用類似的方式將它打印到屏幕上。使用外部循環(i)迭代各行,並使用內部循環(j)遍歷列,從而打印出每個列(records[i][j])。

for (int i=0; i<numRecords; i++) 
{ 
    for (int j=0; j<numColumns; j++) 
    { 
     System.out.print(records[i][j]); 

            // extra stuff.. 
     if (j != numColumns-1) { // print commas between items if we want 
      System.out.print(", "); 
     } 
    } 
    System.out.println(""); // print out a newline after each row 
} 
+0

Hi trooper,所有這些都在主要方法中,還是在顯示數組的方法中? – Paul

+0

是的,它可以都是主要的方法。我故意破壞了它,希望你能更多地學習,而不僅僅是提供一個罐頭答案。我希望這仍然有幫助。 – trooper

+0

你當然可以聲明數組作爲你的類的成員,有一個單獨的函數來讀取你的文件並填充它,還有一個單獨的函數將它打印到屏幕上,然後你的main方法會創建你的類的一個實例並調用適當的方法 - 但這完全超出了問題的範圍。 – trooper

相關問題