Добавить объект в ArrayList по указанному индексу

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

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

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

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

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

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

Ответ 1

Вы можете сделать это следующим образом:

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

После добавления объекта2 в позицию 2 он перемещает объект3 в позицию 3.

Если вы хотите, чтобы объект3 находился в позиции 3 все время, я предлагаю вам использовать HashMap с позицией в качестве ключа и объекта в качестве значения.

Ответ 2

Вы можете использовать массив объектов и преобразовать его в ArrayList-

Object[] array= new Object[10];
array[0]="1";
array[3]= "3";
array[2]="2";
array[7]="7";

List<Object> list= Arrays.asList(array);

ArrayList будет be- [1, null, 2, 3, null, null, null, 7, null, null]

Ответ 3

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

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;

Ответ 4

Вы также можете переопределить ArrayList для вставки нулей между вашим размером и элементом, который вы хотите добавить.

import java.util.ArrayList;


public class ArrayListAnySize<E> extends ArrayList<E>{
    @Override
    public void add(int index, E element){
        if(index >= 0 && index <= size()){
            super.add(index, element);
            return;
        }
        int insertNulls = index - size();
        for(int i = 0; i < insertNulls; i++){
            super.add(null);
        }
        super.add(element);
    }
}

Затем вы можете добавить в любой момент в ArrayList. Например, этот основной метод:

public static void main(String[] args){
    ArrayListAnySize<String> a = new ArrayListAnySize<>();
    a.add("zero");
    a.add("one");
    a.add("two");
    a.add(5,"five");
    for(int i = 0; i < a.size(); i++){
        System.out.println(i+": "+a.get(i));
    }
}   

дает результат с консоли:

0: ноль

1: один

2: два

3: null

4: null

5: пять

Ответ 5

Обращаю ваше внимание на документацию ArrayList.add, в которой говорится, что он вызывает IndexOutOfBoundsException - если индекс выходит за пределы диапазона (index < 0 || index > size())

Проверьте size() вашего списка перед вызовом list.add(1, object1)

Ответ 6

Вам нужно заполнить пустые индексы нулями.

while (arraylist.size() < position)
{
     arraylist.add(null);
}

arraylist.add(position, object);

Ответ 7

@Maethortje 

The problem here is java creates an empty list when you called new ArrayList and 

при попытке добавить элемент в указанной позиции вы получили IndexOutOfBound, поэтому список должен иметь некоторые элементы в их положении.

Пожалуйста, попробуйте следующее

/*
  Add an element to specified index of Java ArrayList Example
  This Java Example shows how to add an element at specified index of java
  ArrayList object using add method.
*/

import java.util.ArrayList;

public class AddElementToSpecifiedIndexArrayListExample {

  public static void main(String[] args) {
    //create an ArrayList object
    ArrayList arrayList = new ArrayList();

    //Add elements to Arraylist
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");

    /*
      To add an element at the specified index of ArrayList use
      void add(int index, Object obj) method.
      This method inserts the specified element at the specified index in the
      ArrayList.  
    */
    arrayList.add(1,"INSERTED ELEMENT");

    /*
      Please note that add method DOES NOT overwrites the element previously
      at the specified index in the list. It shifts the elements to right side
      and increasing the list size by 1.
    */

    System.out.println("ArrayList contains...");
    //display elements of ArrayList
    for(int index=0; index < arrayList.size(); index++)
      System.out.println(arrayList.get(index));

  }
}

/*
Output would be
ArrayList contains...
1
INSERTED ELEMENT
2
3

*/

Ответ 8

Как об этом мало в while циклы в качестве решения?

private ArrayList<Object> list = new ArrayList<Object>();

private void addObject(int i, Object object) {
    while(list.size() < i) {
        list.add(list.size(), null);
    }
    list.add(i, object);
}
....

addObject(1, object1)
addObject(3, object3)
addObject(2, object2)

Ответ 9

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

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

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

Ответ 10

Это возможное решение:

list.add(list.size(), new Object());

Ответ 11

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

Ответ 12

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

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 т. ArrayList Если вы должны добавлять такие элементы, как, например,

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

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

Ответ 13

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

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

Список будет содержать [object1, object2]

Ответ 14

Предположим, вы хотите добавить элемент в позицию, тогда размер списка должен быть равен или больше позиции.

add(2, item): этот синтаксис означает, переместите старый элемент в позиции 2 в следующий индекс и добавьте элемент во 2-ю позицию.

Если во второй позиции нет элемента, это не сработает, оно выдает исключение.