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:
- Java HttpClient no puede analizar la dirección IP en Android
- Error de aserción (scn == 3 || scn == 4) en void cv :: cvtColor (cv :: InputArray Android
- Creación de un registro WiFi NDEF utilizando application / vnd.wfa.wsc en Android
- Manera más eficiente de pausar el bucle deseado
- Error de Android: la aplicación se ha detenido de forma inesperada, inténtalo de nuevo.
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?
- Compruebe si la actividad se ha iniciado en el servicio
- Extraños caracteres de cita alrededor de static java String (en android?)
- Cómo agregar Maven a un proyecto de IntelliJ Android existente
- Uso de URLs absolutas con Retrofit
- NFC Mifare Ultralight etiquetas de escritura
- Android Actualiza ListActivity desde BaseAdapter
- Recuperar el estado de la conexión wifi (Android)
- Error al crear la propia biblioteca de tarro para el proyecto de Android
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
-
add
elementos nulos a un índice específico en unArrayList
-
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]
- Cómo configurar el botón de radio marcado como predeterminado en radiogroup con Android
- ¿Cómo llenar un ListView con una ArrayList?