这个问题需要一些解释,我会尽量简洁:
我正在尝试初始化Can对象数组,这些对象只有2个字段(两个字符串):名称,制造商
我试图通过使用以下格式读取CSV文件来初始化字段:
西红柿,亨氏
Legumes,Jerry
(行之间没有空格,出于某种原因,它的格式与此网站上的格式相同)
每行中的第一个字符串是我想要成为名称的值,第二个是制造商。
所以我创建了一个方法来读取CSV的每一行,它将每一行传递给一个tokenizer方法来提取单个值:
private void readFile (String inFilename) {
FileInputStream fileStrm = null;
InputStreamReader rdr;
BufferedReader bufRdr;
int lineNum;
String line;
try {
fileStrm = new FileInputStream(inFilename);
rdr = new InputStreamReader(fileStrm);
bufRdr = new BufferedReader(rdr);
lineNum = 0;
line = bufRdr.readLine();
while {line != null) {
lineNum++;
processLine(line); //passes line to tokenizer
line = bufRdr.readLine();
}
fileStrm.close();
}
catch (IOException e) {
if (fileStrm != null) {
try { fileStrm.close(); } catch (IOException ex2) { }
}
System.out.println("Error in file processing: " + e.getMessage());
}
}
这些行被传递给这个tokenizer方法:
private String processLine(String csvRow) {
String thisToken = null;
StringTokenizer strTok;
strTok = new StringTokenizer(csvRow, ",");
while (strTok.hasMoreTokens()) {
thisToken = strTok.nextToken();
}
}
这就是我有点陷入困境的地方。要初始化我的数组,我想我需要一个for循环,比如
for (int i=0; i<=array.length;i++)
{
array[i].name = readFile("filename.csv");
array[i].manufacturer = readFile("filename.csv");
}
但显然这不起作用。谁能建议我怎么做呢?我宁愿保持代码大部分完整,并使用现有代码找出解决方案。
由于
答案 0 :(得分:0)
第一件事: -
您正在调用processLine(line);
,但没有返回此方法的token
读取。所以,此方法在engulped
中获得的令牌只有..所以,你应该从该方法中返回一些东西..
第二: -
array[i].name = readFile("filename.csv");
array[i].manufacturer = readFile("filename.csv");
在上面的代码中,你每次都为这两个属性调用readFile()
..所以,即使你返回了somthing,这两个属性也会被初始化为相同的值。因为每次你开始阅读从头开始文件..
第三件事: -
实际上你的上面的代码不会编译..因为你将readFile()
的值(实际上没有返回任何东西)分配给数组..所以给这个方法一个返回类型..它会是String
..并返回令牌阅读..
编辑: -
* 我建议您使用String
类的split()方法。Tokenizer is not needed here, for just
拆分around a single
逗号(,)`
此外,您可以使用ArrayList而不是使用数组,您可以在其中动态添加新创建的object
。这样,您就不必fix the size
数组..(这就是你想要的,因为你不知道你的文件中有多少行?)
以下是您可以执行的操作:
从某处调用方法readFile
,可能是main()
readFile("filename.csv")
在readFile()
方法中,您可以迭代文件以创建ArrayList
,如下所示: -
List<Can> yourList = new ArrayList<>();
while ((line = reader.readLine()) != null) {
String[] wordRead = line.split(',');
yourList.add(new Can(wordRead[0], wordRead[1]));
}
我认为,Can
是您在课堂上所说的课程名称..