Добавить объект в ArrayList по указанному индексу - PullRequest
130 голосов
/ 12 сентября 2011

Я думаю, что это довольно простой вопрос, но я не могу понять, как это сделать правильно.

У меня есть пустой массив:

ArrayList<object> list = new ArrayList<object>();

У меня естьесть некоторые объекты, которые я хочу добавить, и каждый объект должен быть в определенной позиции.Однако необходимо, чтобы их можно было добавлять в каждом возможном порядке.Когда я пытаюсь это сделать, это не работает, и я получаю IndexOutOfBoundsException:

list.add(1, object1)
list.add(3, object3)
list.add(2, object2)

Я пытался заполнить ArrayList null и затем выполнить вышеописанное.Это работает, но я думаю, что это ужасное решение.Есть ли другой способ сделать это?

Ответы [ 14 ]

1 голос
/ 12 сентября 2011

Я думаю, что решение от Medopal - это то, что вы ищете.

Но еще одно альтернативное решение - использовать HashMap и использовать ключ (Integer) для хранения позиций.

Таким образом, вам не нужно изначально заполнять его нулями и т. Д., Просто придерживайтесь позиции и объекта на карте по мере продвижения. Вы можете написать пару строк в конце, чтобы преобразовать их в список, если вам это нужно.

0 голосов
/ 23 июля 2017

Вы должны установить вместо добавления, чтобы заменить существующее значение в индексе.

list.add(1, object1)
list.add(2, object3)
list.set(2, object2)

Список будет содержать [объект1, объект2]

0 голосов
/ 31 января 2017

Немного поздно, но, надеюсь, все еще может быть полезным для кого-то.

2 шага для добавления элементов в определенную позицию в ArrayList

  1. add пустые элементы для определенного индекса в ArrayList
  2. Тогда set позиции как и когда требуется.

        list = new ArrayList();//Initialise the ArrayList
    for (Integer i = 0; i < mItems.size(); i++) {
        list.add(i, null); //"Add" all positions to null
    }
       // "Set" Items
        list.set(position, SomeObject);
    

Таким образом, у вас не будет лишних элементов в ArrayList, т.е. если вы добавите такие элементы, как,

list = new ArrayList(mItems.size());    
list.add(position, SomeObject);

Это не перезапишет существующие элементы в позиции, просто сдвинув существующие вправо на единицу - так что у вас есть ArrayList с вдвое большим количеством признаков.

0 голосов
/ 10 августа 2016

Если вы используете Java-версию Android, могу ли я предложить SparseArray .Это более эффективное отображение памяти целых чисел и объектов, которое проще итерировать, чем Map

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