Agregar objeto a ArrayList en el índice especificado

142

Creo que es una pregunta bastante simple, pero no puedo entender cómo hacer esto correctamente.

Tengo una lista de matrices vacía:

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

Tengo algunos objetos que quiero agregar 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 funciona y obtengo un IndexOutOfBoundsException:

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

Lo que he intentado es rellenar ArrayListcon nully luego hacer lo anterior. Funciona, pero creo que es una solución horrible. Hay otra manera de hacer esto?

J. Maes
fuente
77
Obtiene una IndexOutOfBoundsException porque la lista está vacía y no puede acceder a una posición de lista que no existe ...
Vic
1
¿Hay alguna manera de crear esa posición sin llenar la lista con objetos nulos? Para mí parece que es una solución realmente extraña.
J. Maes
1
No lo creo ... Si necesita agregar los objetos en un orden aleatorio, tendría que buscar otra forma de hacerlo ... Por ejemplo, con una matriz típica: 'Object []' y luego debería no tengo que llenarlo, solo inicializar
Vic
1
@Maethortje no es realmente un problema extraño. Busque listas dispersas, reference.wolfram.com/mathematica/tutorial/… parece un buen artículo. Sin embargo, en Java, un mapa con índice como clave podría ser el enfoque más fácil.
Variable miserable
2
@Pan Incluso si declara el tamaño ... Simplemente no inicializa la lista, pero declara cuánto espacio desea reservar en la memoria ... Como lo veo, una lista es una matriz de elementos que también tiene un puntero al siguiente elemento Si intenta agregar un elemento en la tercera posición cuando tiene el segundo vacío (o nulo), no tiene un puntero que lo ayude a saber que es el tercer elemento ...: 1-> 2-> 3 está bien, pero 1- > * -> 3 aquí tienes un problema ...
Vic

Respuestas:

209

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 desea que object3 esté en position3 todo el tiempo, le sugiero que use un HashMap con position como clave y object como valor.

superM
fuente
3
Un hashmap podría resolver este problema. Creo que iré por eso ya que no parece que pueda agregar algo en la ubicación 3 cuando no hay ningún objeto en la ubicación 2.
J. Maes
corta pero la mayoría de la respuesta. Otros simplemente están en el camino equivocado
Shabbir Dhangot
Una lógica constructiva!
Arsal Imam
31

Puede usar una matriz de objetos y convertirla 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]

usuario3484940
fuente
2
Un inconveniente es que debe saber el tamaño de antemano.
Daniel Hári
17

Si ese es el caso, ¿por qué no considera usar una matriz regular? Inicialice la capacidad y coloque los objetos en el índice que desee.

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;
medopal
fuente
Inicializa la capacidad, pero no el tamaño de 'ArrayList'. El tamaño se define como el número de elementos, y cuando el índice es> tamaño, aparece la excepción ...
Vic
@Vic, al principio leí mal la pregunta, pero gracias por el consejo.
medopal
Inicialicé la capacidad en 10, pero aún obtengo un IndexOutOfBoundsExceptopn cuando agrego un objeto. Lo mismo con cambiar la capacidad con sureCapacity. Lo único que funciona es llenarse de nulo en este momento ...
J. Maes
@Maethortje Busque la diferencia entre "tamaño" y "capacidad" ... La excepción viene cuando el índice es> el tamaño, no cuando es> capacidad .....
Vic
Como los chicos mencionaron, está agregando un objeto en el índice 3, mientras que el tamaño de la lista sigue siendo 1. Eso no es posible. Se permite agregar en un índice específico siempre que este índice esté dentro de los límites de la lista, por ejemplo, si su lista tiene 3 objetos, no puede agregar un objeto en el índice 100.
medopal
14

También puede anular ArrayList para insertar valores 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);
    }
}

Luego 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 de la consola:

0: cero

1 uno

2: dos

3: nulo

4: nulo

5: cinco

IngenieroConJava54321
fuente
9

Le llamo la atención sobre la ArrayList.adddocumentación , que dice que arroja IndexOutOfBoundsException, si el índice está fuera de rango ( index < 0 || index > size())

Verifique el size()de su lista antes de llamarlist.add(1, object1)

Variable miserable
fuente
Tienes razón @Hemal, @Maethortje ¿Por qué no verificas el tamaño de la lista antes de agregar el elemento a la lista? verifique si la posición que está tratando de agregar es menor que el tamaño de la lista, si no, entonces puede hacer una normalidadlist.add("element");
Rakesh
1
Según tengo entendido, el "problema" es agregar el elemento en la posición 3 incluso si no hay un elemento en la posición 2 ...
Vic
@Vis es una lista escasa: vea mi comentario a la pregunta.
Variable miserable
5

Debe completar los índices vacíos con valores nulos.

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

arraylist.add(position, object);
Miika Pakarinen
fuente
2
@Maethortje 

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

al intentar agregar un elemento en la posición especificada, obtuvo IndexOutOfBound, por lo 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

*/
Sankalp
fuente
Entiendo el problema que causa mi error. Parece que tengo que agregar objetos a las posiciones posteriores antes de poder agregar un objeto a esa posición. En el momento en que agrego, no estoy desechando todos los objetos que quiero agregar. ¿Crees que agregar objetos nulos es una solución adecuada entonces?
J. Maes
@Maethortje No será muy justo hacer esto, ya que es solo un truco :)
Sankalp
debe eliminar las citas de muestra de código del primer párrafo.
Jalal Sordo
2

¿Qué tal este pequeño whilebucle como 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)
Stewart
fuente
2

Esta es una posible solución:

list.add(list.size(), new Object());
Darius
fuente
1

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

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

De esta manera, no necesitará llenarlo con valores nulos, etc. inicialmente, solo pegue la posición y el objeto en el mapa a medida que avanza. Puede escribir un par de líneas al final para convertirlo en una Lista si así lo necesita.

Ashkan Aryan
fuente
¿No es mejor TreeMap ya que está ordenado por teclas?
Daniel Hári
1

Supongamos que desea agregar un elemento en una posición, entonces el tamaño de la lista debe ser mayor que la posición.

add(2, item): esta sintaxis significa, mover el elemento anterior en la posición 2 al siguiente índice y agregar el elemento en la segunda posición.

Si no hay ningún elemento en la segunda posición, esto no funcionará, arrojará una excepción.

Eso significa que si quieres agregar algo enposition 2,

el tamaño de su lista debe ser al menos (2 + 1) =3,para que los artículos estén disponibles en0,1,2 Position.

de esa forma se garantiza que se acceda a la posición 2 de forma segura y no habrá excepción.

Shamsul Arefin Sajib
fuente
2
Estoy de paso cuando notifiqué su respuesta ... en realidad, el índice debe ser menor o igual que la longitud real de la lista en el momento en que estamos insertando un nuevo elemento. exhale: el tamaño de la lista es 2: agregar en el índice 2 funcionará. agregar en el índice 3 arrojará una excepción. (Fue probado)
Houssem Chlegou
0

Si está utilizando el sabor de Android de Java, podría sugerirle que use un SparseArray . Es un mapeo de enteros a objetos más eficiente en la memoria y más fácil de iterar que un Map

AllDayAmazing
fuente
0

Un poco tarde pero con suerte aún puede ser útil para 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. Luego setlas posiciones como y cuando 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, no tiene elementos redundantes, ArrayListes decir, si fuera a agregar elementos como,

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

Esto no sobrescribirá los elementos existentes en la posición simplemente, desplazando los existentes a la derecha por uno, por lo que tiene una ArrayList con el doble de indicaciones.

Zain
fuente
0

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á [objeto1, objeto2]

Saurabh
fuente