IndexOutOfBoundsException при увеличении ArrayList - PullRequest
0 голосов
/ 05 февраля 2020

Я застрял в проблеме, которая возникла в моем задании по кодированию. Нам было поручено прочитать два txt-файла на основе данных traffi c, а затем создать объекты для каждого штата в США, содержащие код ID штата, название штата и количество аварийных ситуаций traffi c в каждом штате.

Я считаю, что мой код почти полностью корректен, но я продолжаю получать исключение IndexOutOfBoundsException при попытке напечатать мой конечный продукт, который является каждым объектом в моем массиве.

Вот мой код:

    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());
        }



    }

}

Строка, которая дает мне ошибку:

stateData.get(stateID-1).incrementAccidentCount();

Я бы очень признателен за помощь, потому что я чувствую, что это простое исправление, но я был в тупик и часами не знаю, что еще попробовать.

Вот два текстовых файла, из которых я читаю:

Statecode.txt: https://pastebin.com/LCRLystK Stateaccidents.txt: https://pastebin.com/bDGDu4UQ

Если есть какая-либо другая информация, которую я могу предоставить, чтобы помочь вам, пожалуйста, дайте мне знать! Это мой первый пост, поэтому я прошу прощения, если в моем вопросе есть какие-либо ошибки, я обязательно исправлю их, если потребуется. Спасибо!

1 Ответ

1 голос
/ 05 февраля 2020

Проблема, с которой вы столкнулись, заключается в том, что метод ArrayList.get основан на индексе, и вы используете значение , вычисленное из идентификатора состояния, которое не обязательно является индексом.

На самом деле, если вы посмотрите на Statecode.txt, в нем отсутствует идентификатор состояния 3. Таким образом, идентификатор состояния 1 имеет индекс 0, и это работает. Хотя идентификатор состояния 4 находится в индексе 2, что может привести к путанице. По мере того, как вы переходите вниз по списку, пропадает еще больше, поэтому идентификатор состояния 56 находится в индексе 53 (немного догадываясь). Поэтому, когда вы делаете get(stateId -1) для состояния # 56, оно делает get(55), что, на самом деле, превышает длину ArrayList.

Так что вам нужно найти другой способ получить количество аварий для штат. Несколько вариантов, которые я могу придумать:

  • Для каждой строки аварии вы можете l oop просмотреть все записи состояния, чтобы найти ту, которая имеет соответствующий идентификатор состояния. Мне не очень нравится эта идея.
  • Врачуйте ваши данные statecode.txt, чтобы ваш справочник работал (поэтому добавьте состояние 3 с именем 'unkown'). Это плохая идея, чтобы проверить ваши входные данные, а также плохая идея ожидать полного набора данных.
  • Используйте другой тип сбора. Это то, что я бы сделал, вероятно, java .util.Dictionary
...