2012-02-20 15 views
-1

.csvファイルから取得するトークンから、ArrayListをJavaで作成する際に問題が発生しました。私は何時間も成功していないことを理解しようとしてきました。 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());以外の方法でリストするst.nextToken()をypecasting、およびst.nextToken()に変数を割り当て、そのような:

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

...しかし、これらのアプローチのどれも動作するようには思えません。

このプログラムの目的は、着信する.csvファイル内のすべてのトークンを取り出し、後で使用するためにきちんとArrayListに入れることです。私はまだJavaにはまだ初心者ですが、ジェネリックスがこの問題を解決するうえでどのように役割を果たすかについてはまだ不明です。私が理解しているように、StringTokenizerは 'string'タイプですが、私はを使用してArrayListのトークンを<Strings>で入力する必要がありますが、その方法はわかりません。どんな助け/ヒント/フィードバックも非常に高く評価されています!

答えて

2

A)ループするたびにst.nextToken()を2回呼び出しています。あなたは他のすべてのトークンを失ったばかりで、最終的には2回目の呼び出しで...それがないからです。あなたのcsvファイルに1行に10個のアイテムがあれば、それは成功し、あなたの5個はあなたのArrayList

B)新しいコードでStringTokenizerを使用しないでください。 Javadocはそれが従来のクラスで、代わりにString.split()を使用することを説明しています。

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

完了。

編集追加する:をあなた本当にArrayListではなく配列が必要な場合は、あなたがして行うことができます。

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

あなたはすでにあなたのSystem.outst.nextTokenを行っています。したがってトークンはもう存在しません。 System.outにそれが必要な場合は、st.nextTokenに変数&を割り当ててから使用してください。

0

ループするたびに2つの要素が先にジャンプしています。コードは、トークン読んで、それを使用します。

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

そして:nextTokenメソッドをループ内で2回呼び出され

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

          list.add(token); 
0

、あなたのような何かにあなたのコードを変更する必要があります。

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

          list.add(tempStr); 
        } 
+0

私はそれを逃したとは思わない。みんな、ありがとう! – spacetree

0

他の回答に記載されているように、問題は1回の繰り返しでnextTokenを2回以上呼び出すことです。これはその使用目的ではありません。

古くなった古い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]); 
} 
関連する問題