我在从.csv文件中获取的令牌中创建Java ArrayList
时遇到了麻烦。我一直试图弄清楚几个小时没有成功。如果不创建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
组成的<Strings>
,但不确定如何。任何帮助/提示/反馈都非常感谢!!!
答案 0 :(得分:2)
A)每次循环时你都会调用st.nextToken()
两次。你刚刚丢失了所有其他令牌,最终它会因为第二次调用而失败...没有一个(如果你的csv文件中每行有10个项目,那么它会成功,你的{有5个东西在{ {1}})
B)不要在新代码中使用ArrayList
。它的Javadoc解释了它是一个遗留类,而是使用StringTokenizer
。
String.split()
完成。
编辑添加:如果确实需要String[] elements = strLine.split(",");
而不是数组,则可以执行以下操作:
ArrayList
答案 1 :(得分:0)
您已在st.nextToken
中执行了System.out
。因此令牌将不再存在。如果您需要System.out
,请先将st.nextToken
指定给变量&amp;然后使用它。
答案 2 :(得分:0)
String token = "";
token = st.nextToken();
然后:
System.out.println("Line # " +
lineNumber + ", Token # " +
tokenNumber + ", Token : "+
token );
list.add(token);
答案 3 :(得分:0)
在循环中调用nextToken方法两次,您可能需要将代码更改为:
while(st.hasMoreTokens())
{
tokenNumber++;
String tempStr = st.nextToken();
System.out.println("Line # " +
lineNumber + ", Token # " +
tokenNumber + ", Token : "+
tempStr);
list.add(tempStr);
}
答案 4 :(得分: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]);
}