2012-02-20 69 views
-1

我一直在使用從.csv文件獲取的令牌在Java中創建ArrayList時遇到問題。我一直試圖找出幾個小時沒有成功。如果不創建ArrayList,我所有的令牌都可以毫無問題地打印出來,但是當我創建一個ArrayList來添加它們時,我遇到了麻煩。對於每行包含60多行和9個標記(字符串)的.csv文件,我在添加到ArrayList之前打印出我擁有的內容,但在創建ArrayList並向它們添加標記之後,我只能打印出第一個在碰到一個NoSuchElementException之前幾個令牌。將.csv文件中的令牌添加到Java中的ArrayList中

這是我的所有代碼:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.util.StringTokenizer; 
import java.lang.String; 
import java.util.ArrayList; 
import java.util.*; //probably redundant 
import java.util.Scanner; 

public class TTcompiler18Feb { 

    private static ArrayList<String> list; 

    public static void main(String[] args) { 

    try 
    { 
     //csv file containing data 
     String strFile = "FileWithTokens.csv"; 

     //create BufferedReader to read csv file 
     BufferedReader br = new BufferedReader(new FileReader(strFile)); 

     String strLine = ""; 
     StringTokenizer st = null; 
     int lineNumber = 0, tokenNumber = 0; 

     list = new ArrayList<String>(); 
     String token; 

     //read comma separated file line by line 
     while((strLine = br.readLine()) != null) 
     { 
     lineNumber++; 
     st = new StringTokenizer(strLine, ","); 

     while(st.hasMoreTokens()) 
     { 
      tokenNumber++;  
      System.out.println("Line # " + 
          lineNumber + ", Token # " + 
          tokenNumber + ", Token : "+ 
          st.nextToken()); 
      list.add(st.nextToken()); 
     } 
     //reset token number 
     tokenNumber = 0; 
     } 
     System.out.println("The size of your list is: " + list.size()); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exception while reading csv file: " + e);     
    } 
    } 
} 

我跑我的代碼,並得到如下:

運行TTcompiler18Feb

Line # 1, Token # 1, Token : Row1Token1 
Line # 1, Token # 2, Token : Row1Token2 
Line # 1, Token # 3, Token : Row1Token3 
Line # 1, Token # 4, Token : Row1Token4 
Line # 1, Token # 5, Token : Row1Token5 
Exception while reading csv file: java.util.NoSuchElementException 

我嘗試添加到我的以list.add(st.nextToken());之外的其他方式列出,例如使用.toString方法,t ypecasting st.nextToken(),並st.nextToken()爲變量賦值,就像這樣:

token = st.nextToken().toString(); //defined as string type outside loop 
list.add(token); 

...但這些方法都沒有似乎工作。

該程序的目標是獲取傳入的.csv文件中的所有標記,並將它們整齊地放入ArrayList以供稍後使用。我對Java仍然很陌生,對於泛型如何在解決這個問題中起作用仍然不清楚。據我瞭解,StringTokenizer是'string'類型,但我需要使用一個<String>將我的令牌輸入到由<Strings>組成的ArrayList,但不知道如何。任何幫助/提示/反饋非常感謝!

回答

2

A)每次循環播放時,您都會打電話st.nextToken()兩次。你只是失去了所有其他的令牌,並最終因爲第二次電話而嘔吐......沒有一個(如果你在csv文件中每行有10個項目,它會成功,你會有5件事在你的ArrayList

B)不要在新代碼中使用StringTokenizer。 Javadoc爲它解釋了它是一個遺留類,並使用String.split()來代替。

String[] elements = strLine.split(","); 

完成。

編輯補充:如果你真的需要ArrayList而不是一個數組,你可以再做:

ArrayList<String> list = new ArrayList<String>(Arrays.asList(elements)); 
0

你已經在你的System.out做一個st.nextToken。所以令牌不再存在。如果您需要System.out,請將st.nextToken分配給變量&然後使用它。

0

在每次循環時,你都會跳躍前進兩個元素。代碼閱讀記號,然後用它:

String token = ""; 
token = st.nextToken(); 

然後:

      System.out.println("Line # " + 
               lineNumber + ", Token # " + 
               tokenNumber + ", Token : "+ 
               token); 

          list.add(token); 
0

nextToken方法是在循環中調用了兩次,你可能需要更改您的代碼是這樣的:

while(st.hasMoreTokens()) 
        { 
          tokenNumber++;  
          String tempStr = st.nextToken(); 
          System.out.println("Line # " + 
               lineNumber + ", Token # " + 
               tokenNumber + ", Token : "+ 
               tempStr); 

          list.add(tempStr); 
        } 
在其他的答案中提到
+0

我不能相信我錯過了。感謝大家! – spacetree 2012-02-20 06:00:14

0

至於,你的問題是與調用不止一次nextToken更在單次迭代,這是不是它打算如何使用。

而不是使用笨重的舊StringTokenizer的,你爲什麼不使用String.split()

String[] tokens = strLine.split(","); 

for(int i = 0; i < tokens.length; i++) { 
    System.out.println("Line # " + 
         lineNumber + ", Token # " + 
         i+ ", Token : "+ 
         token[i]);  
    // do you even need a list? 
    list.add(token[i]); 
} 
相關問題