使用分隔符读取文件并添加到数组

Read file using delimiter and add to array

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

我似乎可以正常读取文件,但很难根据文本文件中每行的第一个元素创建不同的对象

文本文件是这样的

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

我的预期结果是根据上述文件示例

中文本中的第一个元素创建一个UltimateLanding对象或StrongLanding对象

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

我的代码-

已编辑 - 程序似乎正在读取文件并正确地添加到数组中。但是,它只对文件的第一行这样做吗?应该创建 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

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

  • 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);
    }
}
...

一个解决方案。

List<Landing> landings = Files.lines(Paths.get("LandingsData.txt")).map(line -> {
        String[] split = line.split(",");
        if (split[0].equals("sl")) {
            StrongLanding sl = new StrongLanding();
            sl.setLandingId(Integer.parseInt(split[1]));
            sl.setLandingDesc(split[2]);
            sl.setNumLandings(split[3]);
            sl.setCost(Double.parseDouble(split[4]));
            return sl;
        } else if (split[0].equals("ul")) {
            UltimateLanding ul = new UltimateLanding();
            ul.setLandingId(Integer.parseInt(split[1]));
            ul.setLandingDesc(split[2]);
            ul.setNumLandings(split[3]);
            ul.setCost(Double.parseDouble(split[4]));
            return ul;
        }
        return null;
    }).filter(t -> t!= null).collect(Collectors.toList());