Алфавитный блок 2

#java #arraylist #iteration #indexoutofboundsexception

#java #список массивов #итерация #исключение indexoutofboundsexception

Вопрос:

 public static ArrayList<ArrayList<String>> hoops(ArrayList<String> a) {
    ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>(26);
    
    for (char x = 'a'; x <= 'z'; x  ) {
        list.add(new ArrayList<String>());
    }
    
    for (int y = 0; y < a.size(); y  ) {
        for (char x = 'a'; x <= 'z'; x  ) {
            if (String.valueOf(x).equals(a.get(y).substring(0, 1))) {
                list.get(x - 97).add(a.get(y));
            }
        }
    }
    
    return list;
}
 

Это код, предназначенный для «Написания и тестирования метода, который принимает список слов, содержащий строки буквенных символов, разбивает их на 26 «сегментов» в соответствии с первой буквой и возвращает ArrayList сегментов. Каждое ведро должно быть представлено ArrayList. Первая корзина должна содержать все строки из слов, начинающихся на букву «а», в том же порядке, в каком они появляются в словах; вторая корзина должна содержать все строки, начинающиеся на букву «в»; и так далее. Ваш метод должен проходить по словам списка только один раз и оставлять его неизменным «.

Когда я запускаю следующий код…

 public static void main(String[] args) {
    ArrayList<String> a = new ArrayList<String>(Arrays.asList("cat", "dog", "person", "beetle", "insect"));
    ArrayList<Integer> b = new ArrayList<Integer>(Arrays.asList(1, 3, 2, 5, 3, 0, 1, 3));
    
    System.out.print(hoops(a).get('a'));
}
 

Я получаю сообщение об ошибке…

 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 97, Size: 26
at java.util.ArrayList.rangeCheck(ArrayList.java:659)
at java.util.ArrayList.get(ArrayList.java:435)
at marcoB.Reverse.main(Reverse.java:13)
 

Как я могу это исправить?

PS. Я только что задал вопрос, похожий на этот, но я отредактировал свой код и внедрил x — 97

Ответ №1:

Исключение IndexOutOfBoundsException возникает, когда вы пытаетесь сослаться или «получить» значение по индексу массива, которого у него нет. Вы видите, что 97 появляется в сообщении об ошибке из-за этой строки в вашем основном методе:

 System.out.print(hoops(a).get('a'));
 

‘a’ в этом случае превращается в значение ASCII, равное 97 (см. http://www.asciitable.com / подробнее), который находится вне диапазона ArrayList, на который вы ссылаетесь (26). Так что либо сделайте a get(0) , либо a get('a'-97) , если вы хотите сохранить остальную часть вашей реализации неизменной, и получите список, содержащий символы «a».

Есть определенно более причудливые способы печати списка с определенным символом, если вы углубитесь в это.

Я бы также предложил сделать имена ваших переменных более значимыми в ваших циклах. Например, x letter y word вам может быть проще отслеживать изменение на и, а не на x и y, особенно когда вы начинаете работать с более сложными циклическими структурами.

Комментарии:

1. Большое спасибо. Теперь это имеет гораздо больше смысла.