首页 > 解决方案 > 使用分隔符读取文件并添加到数组

问题描述

我正在尝试从我的项目工作区中的文本文件中读取;

我似乎正在阅读文件,但我正在努力根据文本文件中每一行的第一个元素创建不同的对象

文本文件是这样的

ul,1,gg,0,33.0
sl,2,hh,0,44.0

我的预期结果是根据上面文件示例中的第一个元素创建一个UltimateLanding对象或对象StrongLanding

免责声明 - 我知道.equals在 IF 语句中使用不正确,我尝试了很多方法来解决这个问题

我的代码 -

已编辑- 程序现在似乎正在读取文件并正确添加到数组中。但是,它只对文件中的第一行执行此操作?应该创建 2 个对象,因为文本文件中有 2 行。

     Scanner myFile = new Scanner(fr);
     String line;
     myFile.useDelimiter(",");
while (myFile.hasNext()) {
    line = myFile.next();
    if (line.equals("sl")) {
        StrongLanding sl = new StrongLanding();
        sl.setLandingId(Integer.parseInt(myFile.next()));
        sl.setLandingDesc(myFile.next());
        sl.setNumLandings(Integer.parseInt(myFile.next()));
        sl.setCost(Double.parseDouble(myFile.next()));
        landings.add(sl);
    } else if (line.equals("ul")) {
        UltimateLanding ul = new UltimateLanding();
        ul.setLandingId(Integer.parseInt(myFile.next()));
        ul.setLandingDesc(myFile.next());
        ul.setNumLandings(Integer.parseInt(myFile.next()));
        ul.setCost(Double.parseDouble(myFile.next()));
        landings.add(ul);
    }
}

TIA

标签: javajava.util.scanner

解决方案


您当前的代码存在多个问题。

  • myFile.equals("sl")将您的Scanner对象与String. 您实际上想比较您的读取字符串line,而不是您的Scanner对象。所以line.equals("sl")
  • nextLine()将阅读整行。所以line永远不会等于“sl”。您应该使用指定的分隔符拆分行,然后使用拆分的部分来构建您的对象。这样,您就不必担心换行符与next().
  • 目前,您对读取输入的评估在while循环之外,因此您将读取文件的所有内容,但仅评估最后一行(当前)。您应该在 while 循环内移动对输入的评估和着陆对象的创建。

所有建议均已实施:

...
Scanner myFile = new Scanner(fr); 
// no need to specify a delimiter, since you want to read line by line
String line;
String[] splitLine;
while (myFile.hasNextLine()) {
    line = myFile.nextLine();
    splitLine = line.split(","); // split the line by ","
    if (splitLine[0].equals("sl")) {
        StrongLanding sl = new StrongLanding();
        sl.setLandingId(Integer.parseInt(splitLine[1]));
        sl.setLandingDesc(splitLine[2]);
        sl.setNumLandings(Integer.parseInt(splitLine[3]));
        sl.setCost(Double.parseDouble(splitLine[4]));
        landings.add(sl);
    } else if (splitLine[0].equals("ul")) {
        UltimateLanding ul = new UltimateLanding();
        ul.setLandingId(Integer.parseInt(splitLine[1]));
        ul.setLandingDesc(splitLine[2]);
        ul.setNumLandings(Integer.parseInt(splitLine[3]));
        ul.setCost(Double.parseDouble(splitLine[4]));
        landings.add(ul);
    }
}
...

但是,如果您不想逐行阅读内容(由于您有任何要求),您可以通过 继续阅读next(),但您必须正确指定分隔符:

...
Scanner myFile = new Scanner(fr);
String line; // variable naming could be improved, since it's not the line
myFile.useDelimiter(",|\\n"); // comma and newline as delimiters
while (myFile.hasNext()) {
    line = myFile.next();
    if (line.equals("sl")) {
        StrongLanding sl = new StrongLanding();
        sl.setLandingId(Integer.parseInt(myFile.next()));
        sl.setLandingDesc(myFile.next());
        sl.setNumLandings(Integer.parseInt(myFile.next()));
        sl.setCost(Double.parseDouble(myFile.next()));
        landings.add(sl);
    } else if (line.equals("ul")) {
        UltimateLanding ul = new UltimateLanding();
        ul.setLandingId(Integer.parseInt(myFile.next()));
        ul.setLandingDesc(myFile.next());
        ul.setNumLandings(Integer.parseInt(myFile.next()));
        ul.setCost(Double.parseDouble(myFile.next()));
        landings.add(ul);
    }
}
...

推荐阅读