0

这个问题需要解释一下,我会尽量简洁:

我试图初始化一个 Can 对象数组,这些对象只有 2 个字段(都是字符串):名称、制造商

我正在尝试通过读取具有以下格式的 CSV 文件来初始化字段:

西红柿,亨氏

豆类,杰瑞

(两行之间没有空格,由于某种原因,它在本网站上的格式是这样的)

每行中的第一个字符串是我想成为名称的值,第二个是制造商。

所以我创建了一个方法来读取 CSV 的每一行,它将每一行传递给一个标记器方法以提取单个值:

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());
        }   
    }

这些行被传递给这个标记器方法:

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");
    }

但显然这行不通。谁能建议我怎么做?我宁愿保持代码基本完整,并使用现有代码找出解决方案。

谢谢

4

1 回答 1

0

第一件事:-

您正在调用processLine(line);,但没有返回从此方法中token读取的内容。因此,在此方法中获得的令牌engulped仅在此处..因此,您应该从该方法中返回某些内容..

第二:-

array[i].name = readFile("filename.csv");
array[i].manufacturer = readFile("filename.csv");

在上面的代码中,你readFile()每次都调用这两个属性。所以,即使你返回了一些东西,这两个属性也会被初始化为相同的值。因为每次你都是从头开始读取文件的。

第三件事:-

实际上,您上面的代码将无法编译..因为您将readFile()(实际上没有返回任何内容)的值分配给数组..所以给这个方法一个返回类型..它将是String..并返回读取的令牌。 .

编辑:- *我建议,您可以使用类的split()方法String..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是您在问题中所述的班级名称..

于 2012-09-27T04:22:56.700 回答