ArrayList неожиданный неожиданный результат - PullRequest
1 голос
/ 21 марта 2012

Привет, ребята, я ловлю исключение:

java.lang.IndexOutOfBoundsException: Индекс: 1, Размер: 0

Код выглядит так:

 **ArrayList decoded = new ArrayList(10);
        decoded.add(1, "A");**

Я действительно не понимаю, что здесь не так?

Может быть, кто-то может помочь мне в этом.


В основном я хочу сделать это: у меня есть символы, например, нравится это:

ABCEDFG

и массив с числами:

321211

Мне нужно взять первый символ и первое число.запишите в S arrayList:

S={"A"};

Посмотрите на число и снова напишите тот же символ в этой позиции, если число равно 3, тогда на третьем месте: (Если число 1, то просто запишите его в arrayList)

S={"A","","","A"}

И удалить число и символ из массива списков.Теперь они выглядят так:

BCEDFG

21211

и опять то же самое до конца.

Ответы [ 3 ]

5 голосов
/ 21 марта 2012

Я подозреваю, что вы запутались между емкостью и размером . Эта строка:

ArrayList decoded = new ArrayList(10);

... создает список с емкостью , равной 10 (ему не нужно будет расти внутри, пока не будет добавлен одиннадцатый элемент), но размером , равным 0. только индекс, вы можете добавить что угодно 0.

Если вы хотите иметь возможность устанавливать значения в произвольных позициях, вам следует сначала заполнить список, например, (используя дженерики только потому, что я ненавижу использовать необработанные типы):

List<String> decoded = new ArrayList<String>(10);
for (int i = 0; i < 10; i++) {
    decoded.add(""); // Or perhaps null
}

...
decoded.set(1, "S"): // This is now fine, replacing element 1

В качестве альтернативы, если вы уже знаете нужный размер, вы можете использовать массив для начала - они имеют фиксированный размер, и каждый элемент является значением по умолчанию для типа элемента (так что null для строк, например):

String[] decoded = new String[10];
decoded[1] = "S";
2 голосов
/ 21 марта 2012

Сначала ArrayList индексируются с 0. Чтобы добавить первый индекс, вы должны использовать это:

decoded.add(0, "A");

Или добавить в конец списка (я думаю, это то, что вы на самом деле хотите здесь):

decoded.add("A");

Кроме того, вы не можете вставить элемент с индексом n, если у вас уже нет элементов с индексами 0, 1, ... n-1. Если вы хотите читать и записывать в произвольные индексы, то вам следует либо инициализировать ArrayList с нулями в каждом индексе, либо вместо этого можно использовать массив:

String[] decoded = new String[10];
decoded[1] = "A";

Я бы также посоветовал вам , а не удалять из каждого элемента из начала ArrayList в цикле, поскольку это даст производительность O (n 2 ). Вместо этого вы можете использовать очередь. Или не удаляйте элементы из списка, а просто найдите счетчик, который запоминает, сколько элементов было использовано до сих пор.

0 голосов
/ 21 марта 2012

Посмотрите на API документ ArrayList.add (int index, E element) . Это ясно говорит, что метод бросает IndexOutOfBoundsException - if index is out of range (index < 0 || index > size()).

И в вашем случае, когда вы вставляете элемент на index 1, вызывая decoded.add(1, "A"), size() вашего списка decoded будет 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...