web-dev-qa-db-fra.com

Ajouter un objet à ArrayList à l'index spécifié

Je pense que c'est une question assez simple, mais je ne peux pas comprendre comment le faire correctement.

J'ai un auteur vide:

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

J'ai quelques objets à ajouter et chaque objet doit se trouver à une certaine position. Il faut toutefois qu'ils puissent être ajoutés dans chaque ordre possible. Quand j'essaye ça, ça ne marche pas et j'obtiens un IndexOutOfBoundsException:

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

Ce que j'ai essayé, c'est de remplir la ArrayList avec null, puis de faire ce qui précède. Cela fonctionne, mais je pense que c'est une solution horrible. Y a-t-il une autre façon de faire cela?

130
J. Maes

Vous pouvez le faire comme ça:

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

Après avoir ajouté objet2 à la position 2, il déplacera objet3 à la position 3.

Si vous voulez que object3 soit constamment à la position3, je vous suggérerais d'utiliser une carte de hachage avec position comme clé et objet comme valeur.

195
superM

Vous pouvez utiliser un tableau d’objets et le convertir en 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 sera- [1, null, 2, 3, null, null, null, 7, null, null]

27
user3484940

Si c'est le cas, alors pourquoi ne pas envisager d'utiliser un tableau standard, initialisez la capacité et placez les objets à l'index souhaité.

Object[] list = new Object[10];

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

Vous pouvez également substituer ArrayList pour insérer des valeurs NULL entre votre taille et l'élément que vous souhaitez ajouter.

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

Ensuite, vous pouvez ajouter à tout moment dans ArrayList. Par exemple, cette méthode 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));
    }
}   

donne ce résultat depuis la console:

0: zéro

1 un

2: deux

3: null

4: null

5: cinq

13

J'attire votre attention sur la ArrayList.add documentation , qui indique qu'elle jette IndexOutOfBoundsException - si l'index est en dehors de la plage (index < 0 || index > size())

Vérifiez la size() de votre liste avant d'appeler list.add(1, object1)

9
Miserable Variable

Vous devez renseigner les index vides avec des valeurs 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 

en essayant d'ajouter un élément à la position spécifiée, vous avez obtenu IndexOutOfBound, de sorte que la liste devrait avoir certains éléments à leur position.

S'il vous plaît essayer de suivre

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

Que diriez-vous de cette petite boucle while comme solution?

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

C'est une solution possible:

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

Supposons que vous souhaitiez ajouter un élément à une position, la taille de la liste doit alors être supérieure à la position.

add(2, item): cette syntaxe signifie, déplace l'ancien élément de la position 2 vers l'index suivant et ajoute l'élément en 2e position.

S'il n'y a pas d'élément en 2ème position, cela ne fonctionnera pas, cela déclenchera une exception.

Cela signifie que si vous voulez ajouter quelque chose dans position 2,

votre taille de la liste doit être au moins (2 + 1) =3, pour que les éléments soient disponibles à 0,1,2 Position.

de cette manière, il est garanti que la position 2 est accessible en toute sécurité et il n’y aurait pas d’exception.

1

Je pense que la solution de medopal est ce que vous recherchez.

Mais une autre solution consiste à utiliser un HashMap et à utiliser la clé (Integer) pour stocker des positions.

De cette façon, vous n'aurez pas besoin de le remplir avec des valeurs nuls, etc. au début, collez simplement la position et l'objet dans la carte au fur et à mesure. Vous pouvez écrire quelques lignes à la fin pour le convertir en liste si vous en avez besoin.

1
Ashkan Aryan

Un peu tard, mais j'espère que cela peut toujours être utile à quelqu'un.

2 étapes pour ajouter des éléments à une position spécifique dans un ArrayList

  1. add éléments null à un index spécifique dans un ArrayList
  2. Ensuite, set les positions selon les besoins.

        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 cette façon, vous n'avez pas d'éléments redondants dans la ArrayList c'est-à-dire si vous deviez ajouter des éléments tels que,

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

Cela écraserait pas les éléments existants dans la position, en déplaçant ceux existants de un à la droite - de sorte que vous disposiez d'une ArrayList avec deux fois plus d'indices.

0
Zain

Si vous utilisez la version Android de Java, puis-je vous suggérer d'utiliser un SparseArray . Il s'agit d'un mappage des entiers avec des objets plus efficace en termes de mémoire et d'une itération plus facile qu'un mappage.

0
AllDayAmazing

Vous devez définir au lieu d'ajouter pour remplacer la valeur existante à l'index.

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

La liste contiendra [objet1, objet2]

0
Saurabh