Agregar objeto a ArrayList en índice especificado

Creo que es una pregunta bastante simple, pero no puedo averiguar cómo hacerlo correctamente.

Tengo un arraylist vacío:

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

Tengo algunos objetos que quiero añadir y cada objeto tiene que estar en una posición determinada. Sin embargo, es necesario que se puedan agregar en cada orden posible. Cuando intento esto, no trabaja y consigo un IndexOutOfBoundsException :

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

Lo que he intentado es llenar el ArrayList con null y luego hacer lo anterior. Funciona, pero creo que es una solución horrible. Hay otra manera de hacer esto?

Puedes hacerlo así:

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

Después de agregar object2 a la posición 2, moverá object3 a la posición 3.

Si quieres que object3 esté en position3 todo el tiempo, te sugiero que utilices un HashMap con la posición como clave y el objeto como un valor.

Puede utilizar Array de objetos y convertirlo a 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 será – [1, nulo, 2, 3, nulo, nulo, nulo, 7, nulo, nulo]

Si ese es el caso, ¿por qué no considera utilizar un Array regular, inicializar la capacidad y poner objetos en el índice que desea.

 Object[] list = new Object[10]; list[0] = object1; list[2] = object3; list[1] = object2; 

También podría anular ArrayList para insertar nulos entre su tamaño y el elemento que desea agregar.

 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); } } 

A continuación, puede agregar en cualquier punto de la ArrayList. Por ejemplo, este método principal:

 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)); } } 

Produce este resultado desde la consola:

0: cero

1 uno

2: dos

3: nulo

4: nulo

5: cinco

IndexOutOfBoundsException su atención a la documentación de ArrayList.add , que dice que lanza IndexOutOfBoundsException – si el índice está fuera de rango ( index < 0 || index > size() )

Compruebe el size() de su lista antes de llamar a list.add(1, object1)

Es necesario rellenar los índices vacíos con valores nulos.

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

¿Qué tal este bucle pequeño como una solución?

 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) 
 @Maethortje The problem here is java creates an empty list when you called new ArrayList and 

Mientras que intenta agregar un elemento en la posición especificada usted consiguió IndexOutOfBound, así que la lista debe tener algunos elementos en su posición.

Por favor, intente seguir

 /* 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 */ 

Creo que la solución de medopal es lo que estás buscando.

Pero otra solución alternativa es usar un HashMap y usar la tecla (Integer) para almacenar posiciones.

De esta manera no necesitará rellenarlo con valores nulos, etc. inicialmente, simplemente coloque la posición y el objeto en el mapa a medida que avanza. Puedes escribir un par de líneas al final para convertirlo en una Lista si lo necesitas de esa manera.

Esta es una posible solución:

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

Si está utilizando el sabor Android de Java, podría sugerir el uso de un SparseArray . Es una asignación más eficiente de memoria de números enteros a objetos y más fácil de iterar que un mapa

Un poco tarde, pero espero que todavía puede ser útil a alguien.

2 pasos para agregar elementos a una posición específica en un ArrayList

  1. add elementos nulos a un índice específico en un ArrayList
  2. A continuación, set las posiciones según sea necesario.

      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); 

De esta manera usted no tiene artículos redundantes en el ArrayList es decir si usted agregara artículos tales como,

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

Esto no sobrescribiría los elementos existentes en la posición simplemente, cambiando los existentes a la derecha por uno – así que tiene una ArrayList con el doble de indicies.

Debe establecer en lugar de agregar para reemplazar el valor existente en el índice.

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

La lista contendrá [object1, object2]

  • ¿Existe una biblioteca Base64 que sea compatible con Android y Java
  • Java.net.URLEncoder.encode codifica espacio como + pero necesito% 20
  • ¿Cómo puedo comprobar si existe un recurso en Android?
  • Android: ExpandableListViews y casillas de verificación
  • Aplicación de Android + Módulo de Java (Java 1.8)
  • JSON.stringify en java - android
  • Android 8 o superior: comprobar los servicios de Google Play
  • ¿Qué diferencia hay entre rtmp y rtsp?
  • Android Editar texto Enmascaramiento
  • Espere hasta que se complete la tarea
  • Pasar un valor de la actividad a hilo después de hilo ya está creado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.