#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. Большое спасибо. Теперь это имеет гораздо больше смысла.