Java 递增ArrayList时的IndexOutOfBoundsException

Java 递增ArrayList时的IndexOutOfBoundsException,java,arraylist,indexoutofboundsexception,Java,Arraylist,Indexoutofboundsexception,我被编码作业中出现的一个问题困住了。我们的任务是根据交通数据读取两个txt文件,然后为美国每个州创建包含州ID代码、州名称和每个州交通事故数量的对象 我相信我的代码几乎是完全正确的,但是当我试图打印最终产品时,我总是会得到一个IndexOutOfBoundsException,它是我arraylist中的每个对象 这是我的密码: import java.util.*; import java.io.*; public class OuterMain { publ

我被编码作业中出现的一个问题困住了。我们的任务是根据交通数据读取两个txt文件,然后为美国每个州创建包含州ID代码、州名称和每个州交通事故数量的对象

我相信我的代码几乎是完全正确的,但是当我试图打印最终产品时,我总是会得到一个IndexOutOfBoundsException,它是我arraylist中的每个对象

这是我的密码:

    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

您的方法有一个缺陷-状态文件没有按顺序列出所有状态-例如,它缺少代码=7,因此数组中只有54个条目(0..53)-另一方面,事故文件有stateid=56的条目,结果是55,而没有55的条目。如果您需要更多的解释,我可以发布一个答案。@Andy,我将非常感谢您的帮助。我用谷歌搜索论坛已经有一段时间了,我不太明白如何达到预期的效果。如果不太麻烦的话,我会非常感激的。我在这个问题上被难住了一段时间。我想尝试一个小小的改变-我无法测试它,但是…ArrayList.add有第二种形式,允许您将对象放入选择的插槽中-因此当您
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();