2012-09-27 26 views
0

這個問題需要多一點的解釋,我會嘗試儘可能簡潔:只有正在初始化對象從一個CSV文件陣列

我一直在嘗試initalise可以將對象的數組,這些對象有2場(兩個都是字符串):名稱,製造商

我試圖通過從CSV閱讀以下格式文件來初始化字段:

西紅柿,亨氏

豆類,傑裏

(行之間沒有空格,它被格式化一樣,在這個網站出於某種原因)

每一行中的第一個字符串是我想的名字的價值,第二是製造商。

因此,我已經創建了一個方法來讀取CSV,其中通過每個線對的標記生成器的方法來提取單值的各行:

private void readFile (String inFilename) { 
    FileInputStream fileStrm = null; 
    InputStreamReader rdr; 
    BufferedReader bufRdr; 
    int lineNum; 
    String line; 
     try { 
      fileStrm = new FileInputStream(inFilename); 
      rdr = new InputStreamReader(fileStrm); 
      bufRdr = new BufferedReader(rdr); 
      lineNum = 0; 
      line = bufRdr.readLine(); 
      while {line != null) { 
       lineNum++; 
       processLine(line); //passes line to tokenizer 
       line = bufRdr.readLine(); 
       } 
      fileStrm.close(); 
     } 
     catch (IOException e) { 
      if (fileStrm != null) { 
       try { fileStrm.close(); } catch (IOException ex2) { } 
      } 
      System.out.println("Error in file processing: " + e.getMessage()); 
     } 
    } 

的線被傳遞給此標記生成器的方法:

private String processLine(String csvRow) { 
    String thisToken = null; 
    StringTokenizer strTok; 
    strTok = new StringTokenizer(csvRow, ","); 
     while (strTok.hasMoreTokens()) { 
      thisToken = strTok.nextToken(); 
     } 
} 

而這正是我有點卡住了。初始化我的陣列我想我需要一個for循環,像

for (int i=0; i<=array.length;i++) 
    { 
    array[i].name = readFile("filename.csv"); 
    array[i].manufacturer = readFile("filename.csv"); 
    } 

但顯然這是行不通的。任何人都可以建議我如何去做這件事?我更願意保持代碼大部分完整,並使用現有代碼找出解決方案。

感謝

+0

這是什麼結果運行此代碼?你有任何錯誤? –

+0

正確的方法讀取和標記,我只是不知道如何循環我的數組以便通過這些方法inialised。 – Dawson

回答

0

第一件事: -

要調用processLine(line);,但不返回token此方法讀取。所以,只有engulped有這個方法得到的令牌..所以,你應該從該方法返回的東西..

二: -

array[i].name = readFile("filename.csv"); 
array[i].manufacturer = readFile("filename.csv"); 

在上面的代碼中,您每次都調用readFile()這兩個屬性。因此,即使您返回somthing,這兩個屬性也會被初始化爲相同的值。因爲每次您從頭開始讀取文件..

三件事: -

其實你上面的代碼將無法編譯。因爲要分配的readFile()值(這實際上是不返回任何東西)數組。所以放棄迴歸類型此方法..這將是String。而返回的標記讀取..

編輯: - *我建議,你可以使用String類的split()方法..Tokenizer is not needed here, for just分裂around a single逗號(,)`

此外,而不是使用一個數組,你可以使用ArrayList,您可以在其中添加新創建的飛行object ..這樣,你就不必陣列的fix the size ..(?這是你想要的,因爲你不知道你會多少線在你的文件右)

這裏是你可以做什麼: -

  • 呼叫方法readFile從什麼地方,大概main()

    readFile("filename.csv") 
    
  • 在你readFile()方法,你可以對文件重複,以創建一個ArrayList這樣的: -

    List<Can> yourList = new ArrayList<>(); 
    while ((line = reader.readLine()) != null) { 
    
        String[] wordRead = line.split(','); 
        yourList.add(new Can(wordRead[0], wordRead[1])); 
    } 
    

我認爲,Can是名你的班級,因爲你在你的問題所述..

+0

謝謝,for循環還不是我的代碼的一部分,但是試圖顯示我的問題。 我需要某種循環來調用這些方法來初始化數組。我將調查拆分方法,但這並不能解決我的問題 - 如何初始化陣列。 我會添加令牌的回報(我打算這樣做,但忽略了它)。 – Dawson

+0

@Dawson ..其實你不需要從'readFile'中返回任何值..你可以只調用一次這個方法,它會迭代你給出的文件名,並且只在那裏創建你的ArrayList .. –

+0

@ Rohit ..我試圖想象這將如何工作,forFile中的for循環?我將如何構造它,以便我的對象中的兩個字段得到正確初始化? – Dawson