-1

ArrayList.csv ファイルから取得したトークンから Java で を作成する際に問題が発生しました。私は何時間もそれを理解しようとしてきましたが、成功しませんでした。を作成しないとArrayList、すべてのトークンが問題なく出力されますがArrayList、それらを追加するために を作成すると問題が発生します。60 以上の行と各行に 9 つのトークン (文字列) で構成される .csv ファイルの場合、に追加する前に私が持っているものを出力しますArrayListが、ArrayList を作成してそれらにトークンを追加した後、最初のいくつかしか出力できません。に遭遇する前にトークンNoSuchElementException

これはすべて私のコードです:

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、型キャストst.nextToken()したり、変数を に割り当てたりしますst.nextToken()。次のようにします。

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

...しかし、これらのアプローチはどれも機能していないようです。

このプログラムの目的は、受信した .csv ファイル内のすべてのトークンを取得し、ArrayList後で使用できるようにそれらを適切に配置することです。私はまだJavaにかなり慣れていないので、この問題を解決する上でジェネリックがどのような役割を果たすかについてはまだ不明です. 私が理解しているように、StringTokenizerタイプは「文字列」ですが<String>、トークンを でArrayList構成された に入力するために a を使用する必要があります<Strings>が、方法がわかりません。ヘルプ/ヒント/フィードバックは大歓迎です!!!

4

5 に答える 5

2

A) You're calling st.nextToken() twice each time you loop. You just lost every other token, and eventually it pukes because on the second call ... there isn't one (If you had 10 items per line in your csv file, it would succeed and you'd have 5 things in your ArrayList)

B) Don't use StringTokenizer in new code. The Javadoc for it explains it's a legacy class and to use String.split() instead.

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

Done.

Edit to add: if you really need an ArrayList rather than an array, you can then do:

ArrayList<String> list = new ArrayList<String>(Arrays.asList(elements));
于 2012-02-20T05:30:14.730 に答える
0

ループするたびに2つの要素を先にジャンプします。トークンを読み取ってコード化し、それを使用します。

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

その後:

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

                            list.add(token);
于 2012-02-20T05:33:57.737 に答える
0

nextTokenメソッドがループ内で2回呼び出されるため、コードを次のように変更する必要がある場合があります。

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

                            list.add(tempStr);
                    }
于 2012-02-20T05:38:14.527 に答える
0

他の回答で述べたように、問題はnextToken1 回の反復で複数回呼び出すことであり、これは意図した使用方法ではありません。

不格好な古い を使用する代わりに、 を使用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]);
}
于 2012-02-20T05:55:10.037 に答える
0

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

于 2012-02-20T05:30:35.907 に答える