Java 递增ArrayList时的IndexOutOfBoundsException
我被编码作业中出现的一个问题困住了。我们的任务是根据交通数据读取两个txt文件,然后为美国每个州创建包含州ID代码、州名称和每个州交通事故数量的对象 我相信我的代码几乎是完全正确的,但是当我试图打印最终产品时,我总是会得到一个IndexOutOfBoundsException,它是我arraylist中的每个对象 这是我的密码:Java 递增ArrayList时的IndexOutOfBoundsException,java,arraylist,indexoutofboundsexception,Java,Arraylist,Indexoutofboundsexception,我被编码作业中出现的一个问题困住了。我们的任务是根据交通数据读取两个txt文件,然后为美国每个州创建包含州ID代码、州名称和每个州交通事故数量的对象 我相信我的代码几乎是完全正确的,但是当我试图打印最终产品时,我总是会得到一个IndexOutOfBoundsException,它是我arraylist中的每个对象 这是我的密码: import java.util.*; import java.io.*; public class OuterMain { publ
import java.util.*;
import java.io.*;
public class OuterMain {
public static void main(String[] args) throws IOException{
String line;
ArrayList<StateAccident> stateData = new ArrayList <StateAccident>();
File file = new File("StateCode.txt");
FileReader fileReader = new FileReader(file);
BufferedReader br = new BufferedReader(fileReader);
br.readLine();
while((line = br.readLine())!=null){
String arr[] = line.split(" ");
int stateCode = Integer.parseInt(arr[0]);
String stateName = arr[1];
StateAccident accidents = new StateAccident(stateCode,stateName);
stateData.add(accidents);
}
File stateAccidentsFile = new File("StateAccidents.txt");
fileReader = new FileReader(stateAccidentsFile);
br = new BufferedReader(fileReader);
line = null;
br.readLine();
while((line=br.readLine())!=null){
String arr[] = line.split(" ");
int stateID = Integer.parseInt(arr[0]);
stateData.get(stateID-1).incrementAccidentCount();
}
for(StateAccident accidents : stateData){
System.out.println(accidents.toString());
}
}
}
我真的很感谢你的帮助,因为我觉得这是一个简单的解决办法,但我已经被难住了几个小时,真的不知道还有什么可以尝试
以下是我正在读取的两个文本文件:
Statecode.txt:
StateContents.txt:
如果有任何其他信息,我可以提供给你,请让我知道!
这是我的第一篇帖子,所以如果我的问题中有任何错误,我很抱歉,如果需要,我一定会纠正它们。
谢谢大家! 您遇到的问题是,
ArrayList.get
方法是基于索引的,并且您使用的是根据状态id计算的值,而状态id不能保证实际是索引
事实上,如果您查看Statecode.txt,它缺少stateID3。因此,状态id 1位于索引0处,它正好工作。但状态id 4位于索引2,这将导致混淆。当你从列表中往下看时,会有更多的信息丢失,所以状态id 56位于索引53处(在那里有点猜测)。因此,当您对state执行get(stateId-1)
时,它确实执行get(55)
,这实际上超出了ArrayList的长度
因此,你需要找到一种不同的方法来计算该州的事故数量。我可以想到几个选择:
- 对于每一个事故行,您可以循环查看所有状态记录,以找到具有匹配状态id的记录。我不太喜欢这个想法
- 对statecode.txt数据进行修改,使引用生效(因此添加一个名为“unknown”的state3)。对输入数据进行修改是个坏主意,期望得到一整套数据也是个坏主意
- 使用不同类型的集合。这就是我要做的,可能是java.util.Dictionary
stateData.add(意外事件)时代码>改为执行stateData.add(状态代码,事故)代码>。并去掉stateData.get中的“-1”。这仍然假设statescode数据的顺序是递增的,但是这是一项要求。您是否可以向我展示一个使用java.util.Dictionary的示例?实际上我以前从未听说过(我是个新手),我想看看在这种情况下您将如何实现它。我是否必须更改大部分代码,还是只需要调整一行?字典
不是一个好建议。它的javadoc预先说明它已经过时了。您应该使用Map
类;e、 g.HashMap
有关地图的初学者信息,请参阅Oracle教程:“向我展示使用Map
的示例”或其他相关教程(如果以上内容过于高级)。。。谷歌会为你找到一些。但是“为我写一个例子”太过分了。@StephenC我道歉。我正在学习java入门课程,以前从未听说过,我希望有一个简单的解决方案来解决我的问题。我将尝试在地图上做一些研究并尝试解决这个问题,谢谢你的建议。
stateData.get(stateID-1).incrementAccidentCount();