Я думаю, что это довольно простой вопрос, но я не могу понять, как это сделать правильно.
У меня пустой массив:
ArrayList<object> list = new ArrayList<object>();
У меня есть несколько объектов, которые я хочу добавить, и каждый объект должен находиться в определенной позиции. Однако необходимо, чтобы их можно было добавлять в любом возможном порядке. Когда я пытаюсь это сделать, это не работает, и я получаю IndexOutOfBoundsException
:
list.add(1, object1)
list.add(3, object3)
list.add(2, object2)
То , что я пытался это заполнение ArrayList
с , null
а затем делать выше. Это работает, но я считаю это ужасным решением. Есть другой способ сделать это?
Ответы:
Сделать это можно так:
list.add(1, object1) list.add(2, object3) list.add(2, object2)
После того, как вы добавите объект2 в позицию 2, он переместит объект3 в позицию 3.
Если вы хотите, чтобы объект 3 все время находился в позиции 3, я бы посоветовал вам использовать HashMap с позицией в качестве ключа и объектом в качестве значения.
источник
Вы можете использовать массив объектов и преобразовать его в 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, null, 2, 3, null, null, null, 7, null, null]
источник
Если это так, то почему бы вам не рассмотреть возможность использования обычного массива, инициализировать емкость и разместить объекты по желаемому индексу.
Object[] list = new Object[10]; list[0] = object1; list[2] = object3; list[1] = object2;
источник
Вы также можете переопределить 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: ноль
4: ноль
5: пять
источник
Обращаю ваше внимание на
ArrayList.add
документацию , в которой написано, что выкидываетIndexOutOfBoundsException
- если индекс вне допустимого диапазона (index < 0 || index > size()
)Проверьте
size()
свой список, прежде чем звонитьlist.add(1, object1)
источник
list.add("element");
Вам нужно заполнить пустые индексы нулями.
while (arraylist.size() < position) { arraylist.add(null); } arraylist.add(position, object);
источник
@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 */
источник
Как насчет этой маленькой
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)
источник
Это возможное решение:
list.add(list.size(), new Object());
источник
Я думаю, что решение от medopal - это то, что вы ищете.
Но еще одно альтернативное решение - использовать HashMap и использовать ключ (Integer) для хранения позиций.
Таким образом, вам не нужно будет изначально заполнять его нулями и т. Д., Просто вставьте позицию и объект на карту по мере продвижения. Вы можете написать пару строк в конце, чтобы преобразовать его в список, если он вам так нужен.
источник
Предположим, вы хотите добавить элемент в позицию, тогда размер списка должен быть больше, чем позиция.
add(2, item)
: этот синтаксис означает, что переместите старый элемент с позиции 2 на следующий индекс и добавьте элемент во вторую позицию.Если во 2-й позиции нет элемента, это не сработает, это вызовет исключение.
Это означает, что если вы хотите что-то добавить в
position 2,
размер вашего списка должен быть не меньше,
(2 + 1) =3,
чтобы элементы были доступны по адресу0,1,2 Position.
таким образом обеспечивается безопасный доступ к позиции 2 и не будет никаких исключений.
источник
Если вы используете версию Java для Android, могу ли я предложить SparseArray . Это более эффективное сопоставление целых чисел с объектами с точки зрения памяти, и его проще перебирать, чем Map
источник
Немного поздно, но, надеюсь, может быть кому-то полезен.
2 шага для добавления элементов в определенную позицию в
ArrayList
add
нулевые элементы для определенного индекса вArrayList
Затем
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 с вдвое большим количеством индикаторов.
источник
Вы должны установить вместо добавления, чтобы заменить существующее значение в индексе.
list.add(1, object1) list.add(2, object3) list.set(2, object2)
Список будет содержать [объект1, объект2]
источник