java - 使用分隔符读取文件并添加到数组
问题描述
我正在尝试从我的项目工作区中的文本文件中读取;
- 根据文件第一行的第一个元素创建一个对象
- 在对象中设置一些变量
- 然后将它添加到我的arrayList
我似乎正在阅读文件,但我正在努力根据文本文件中每一行的第一个元素创建不同的对象
文本文件是这样的
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
解决方案
您当前的代码存在多个问题。
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);
}
}
...
推荐阅读
- java - 每次使用循环存储矩形大小
- asp.net - 对象引用未设置为视图中布局行中的对象实例
- javascript - 在数组上使用递归
- wpf - 从实体框架填充 TreeView
- python - 在 Jupyter 中导入 imblearn 不起作用
- python - python kivy中的self和root
- android - AlertDialog 隐藏 AutoCompleteTextView 下拉菜单
- sql-server - 如何在 SQL 中使用 sum 获取当前日期的数据?
- node.js - 当我使用 2 个 baseImages 时,在 Dockerfile 中传递环境变量不起作用
- python - 多处理 csv 写入仅写入每个行块的最后一个索引