gpt4 book ai didi

java - 如何在缓冲读取器中执行复杂的操作(循环)?

转载 作者:行者123 更新时间:2023-12-01 13:46:07 25 4
gpt4 key购买 nike

我试图通过从文本文件读取数据来初始化类字段。示例文本文件如下所示:

Movies
Lord of the Rings: 180
Fight Club: 120
Theaters
A:100
B:50
C:200
Shows
1,1,960
1,1,1080
1,1,1200
1,3,1020
1,3,1140
2,2,990
2,2,1210
Prices
Adult:10
Child:7
Senior:8
End

以下是我的代码,它返回 ArrayIndexOutOfBoundsException。

在此代码中,我尝试将文件的“电影”类别下的行解析为类字段,该类字段是电影的数组列表。

电影具有字段名称(字符串)和长度(字符串)。我尝试通过在行中使用分隔符“:”来分割行(以分割电影名称和长度数字)。

    public static void inititializeFromFile(String fileName) 
throws IOException {

BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
while((line = reader.readLine()) != null) {

if(line.equals("Movies")) {

while (!(line.equals("Theaters"))) {
String currentline = line;
String[] parts = currentline.split(":");
String part1 = parts[0];
String part2 = parts[1];
movies.add(new Movie(part1, part2));
}
}
if(line.equals("Shows")) {
// do something
}
if(line.equals("Prices")) {
// do something
}
if(line.equals("Theaters")) {
// do something
}
if(line.equals("...")) {
// do something
}
else if(line.contains(":")) {
//do something
}
else if(line.equals("End")) {
// do something
}
else {
// anything else
}
}
reader.close();
}
}

我是 BufferedReaders 的新手,因此任何有关更好方法的意见或建议将不胜感激。

最佳答案

当你到达电影下的第二个 while 循环时,如果测试你的行仍然等于电影。您不会在 if 测试中阅读更多行。您实际上正在尝试执行 "Movies".split(":")[1]; ,这会使您的索引超出范围。

在第二个 while 循环中到达 Movies 字符串后,您应该阅读更多行。

if(line.equals("Movies")) {
while ((line = reader.readLine()) != null && !line.equals("Theaters")) {
String currentline = line;
String[] parts = currentline.split(":");
String part1 = parts[0];
String part2 = parts[1];
movies.add(new Movie(part1, part2));
}
}

编辑:很多时候,在处理文件时,尤其是如果文件不是您编写的,您可能会出现尾随空格、额外的新行和各种差异。这就是为什么我建议您使用 System.out.println 来轻松快速地观察程序流程。以下是我针对该区域的设置方法

if(line.equals("Movies")) {
System.out.println("Hit Movies");
while ((line = reader.readLine()) != null && !line.equals("Theaters")) {
System.out.println("pasing ("+line+")");
String currentline = line;
String[] parts = currentline.split(":");
String part1 = parts[0];
String part2 = parts[1];
movies.add(new Movie(part1, part2));
}
System.out.println("Finished Movies");
}

如您所见,我在行输出两边加上了括号“pasing ("+line+")”。这就是我的分歧点。剧院线上可能有一个尾随空格。您可能正在比较

“剧院”.equals(“剧院”)

您可以通过执行以下操作来解决此问题:!line.trim().equals("Theaters")

尾随空格、区分大小写、隐藏 ASCII 字符都是解析领域的陷阱。

关于java - 如何在缓冲读取器中执行复杂的操作(循环)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20364905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com