-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是“字符串”类型,但我需要使用 a<String>将我的标记输入到ArrayList由 组成的 中<Strings>,但不知道如何输入。非常感谢任何帮助/提示/反馈!!!

4

5 回答 5

2

st.nextToken()A)每次循环时,您都会调用两次。您只是丢失了所有其他令牌,最终它吐了,因为在第二次调用时......没有一个(如果您的 csv 文件中每行有 10 个项目,它会成功,并且您的 5 个项目中有 5 个项目ArrayList

B)不要StringTokenizer在新代码中使用。它的 Javadoc 解释说它是一个遗留类,可以使用String.split()

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

完毕。

编辑添加:如果你真的需要一个ArrayList而不是一个数组,你可以这样做:

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

你已经st.nextToken在你的System.out. 所以令牌将不再存在。如果您需要它System.out,请先将 分配st.nextToken给一个变量,然后再使用它。

于 2012-02-20T05:30:35.907 回答
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]);
}
于 2012-02-20T05:55:10.037 回答
0

每次循环时,您都会向前跳跃两个元素。代码读取令牌然后使用它:

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 方法在循环中被调用两次,您可能需要将代码更改为:

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 回答