使用分隔符读取文件并添加到数组
Read file using delimiter and add to array
我正在尝试从我的项目工作区中的文本文件中读取;
- 根据文件第一行的第一个元素创建一个对象
- 在对象中设置一些变量
- 然后将其添加到我的arrayList
我似乎可以正常读取文件,但很难根据文本文件中每行的第一个元素创建不同的对象
文本文件是这样的
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());
我正在尝试从我的项目工作区中的文本文件中读取;
- 根据文件第一行的第一个元素创建一个对象
- 在对象中设置一些变量
- 然后将其添加到我的arrayList
我似乎可以正常读取文件,但很难根据文本文件中每行的第一个元素创建不同的对象
文本文件是这样的
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());