Добавить объект в 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 ]

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

Вы можете сделать это так:

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

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

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

27 голосов
/ 01 апреля 2014

Вы можете использовать массив объектов и преобразовать его в 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 будет- [1, ноль, 2, 3, ноль, ноль, ноль, 7, ноль, ноль]

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

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

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;
13 голосов
/ 22 июля 2014

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

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: ноль

4: ноль

5: пять

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

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

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

5 голосов
/ 01 мая 2016

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

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

arraylist.add(position, object);
2 голосов
/ 01 марта 2016

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

list.add(list.size(), new Object());
2 голосов
/ 13 января 2016

Как насчет этой маленькой 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)
2 голосов
/ 12 сентября 2011
@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

*/
1 голос
/ 24 июня 2018

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

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

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

Это означает, что если вы хотите добавьте что-то в position 2,

ваш размер списка должен быть не менее (2 + 1) =3,, чтобы элементы были доступны на 0,1,2 Position.

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

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