it-swarm.it

Aggiungi oggetto a ArrayList all'indice specificato

Penso che sia una domanda abbastanza semplice, ma non riesco a capire come farlo correttamente.

Ho un arraylist vuoto:

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

Ho alcuni oggetti che voglio aggiungere e ogni oggetto deve trovarsi in una determinata posizione. È necessario tuttavia che possano essere aggiunti in ogni ordine possibile. Quando provo questo, non funziona e ottengo un IndexOutOfBoundsException:

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

Quello che ho provato è riempire il ArrayList con null e poi fare quanto sopra. Funziona, ma penso che sia una soluzione orribile. c'è un altro modo per fare ciò?

130
J. Maes

Puoi farlo in questo modo:

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

Dopo aver aggiunto l'oggetto 2 alla posizione 2, sposta l'oggetto 3 nella posizione 3.

Se vuoi che object3 sia sempre in posizione3 ti suggerirei di usare una HashMap con posizione come chiave e oggetto come valore.

194
superM

È possibile utilizzare la matrice di oggetti e convertirla in 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 sarà- [1, null, 2, 3, null, null, null, 7, null, null]

27
user3484940

In questo caso, perché non consideri l'utilizzo di una matrice normale, inizializza la capacità e metti gli oggetti nell'indice che desideri.

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;
15
medopal

È anche possibile sovrascrivere ArrayList per inserire valori nulli tra la propria dimensione e l'elemento che si desidera aggiungere.

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

Quindi puoi aggiungere in qualsiasi punto dell'ArrayList. Ad esempio, questo metodo principale:

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 questo risultato dalla console:

0: zero

1 uno

2: due

3: null

4: null

5: cinque

13

Attiro la tua attenzione sulla ArrayList.add documentation , che dice che genera IndexOutOfBoundsException - se l'indice non è compreso nell'intervallo (index < 0 || index > size())

Controlla la size() della tua lista prima di chiamare list.add(1, object1)

9

È necessario popolare gli indici vuoti con valori null.

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

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

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

mentre provi ad aggiungere un elemento nella posizione specificata hai IndexOutOfBound, quindi l'elenco dovrebbe avere alcuni elementi nella loro posizione.

Per favore prova a seguire

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

*/
2
Sankalp

Che ne dici di questo piccolo ciclo while come soluzione?

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
Stewart

Questa è una possibile soluzione:

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

Supponiamo di voler aggiungere un articolo in una posizione, quindi la dimensione dell'elenco deve essere superiore alla posizione.

add(2, item): questa sintassi significa spostare l'oggetto precedente nella posizione 2 all'indice successivo e aggiungere l'elemento in 2a posizione.

Se non ci sono elementi in 2a posizione, questo non funzionerà, genererà un'eccezione.

Ciò significa che se vuoi aggiungi qualcosa in position 2,

la tua dimensione dell'elenco deve essere almeno (2 + 1) =3, quindi gli elementi sono disponibili su 0,1,2 Position.

in questo modo si garantisce che la posizione 2 sia raggiunta in sicurezza e che non ci siano eccezioni.

1

Penso che la soluzione di Medopal sia ciò che stai cercando.

Ma solo un'altra soluzione alternativa è usare una HashMap e usare la chiave (Intero) per memorizzare le posizioni.

In questo modo non avrai bisogno di popolarlo inizialmente con nulls ecc, basta attaccare la posizione e l'oggetto nella mappa mentre vai avanti. Puoi scrivere un paio di righe alla fine per convertirla in una lista se ne hai bisogno in quel modo.

1
Ashkan Aryan

Un po 'in ritardo, ma si spera possa ancora essere utile a qualcuno.

2 passaggi per aggiungere elementi a una posizione specifica in un ArrayList

  1. add elementi null a un indice specifico in un ArrayList
  2. Quindi set le posizioni come e quando richiesto.

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

In questo modo non hai elementi ridondanti in ArrayList, ad esempio se dovessi aggiungere elementi come,

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

Questo non sovrascrive gli elementi esistenti nella posizione semplicemente, spostando quelli esistenti a destra di uno - in modo da avere un ArrayList con il doppio degli indici.

0
Zain

Se si utilizza l'aroma Android di Java, è possibile suggerire di utilizzare un SparseArray . È una mappatura più efficiente della memoria di interi per oggetti e più facile da scorrere su una mappa

0
AllDayAmazing

È necessario impostare invece di aggiungere per sostituire il valore esistente all'indice.

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

L'elenco conterrà [oggetto1, oggetto2]

0
Saurabh