web-dev-qa-db-fra.com

IndexOutOfBoundsException lors de l'ajout à ArrayList à l'index

Je reçois une exception Exception in thread "main" Java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 pour le code ci-dessous. Mais je ne comprenais pas pourquoi.

public class App {
    public static void main(String[] args) {
        ArrayList<String> s = new ArrayList<>();

        //Set index deliberately as 1 (not zero)
        s.add(1,"Elephant");

        System.out.println(s.size());                
    }
}

Mettre à jour

Je peux le faire fonctionner, mais j'essaie de comprendre les concepts, alors j'ai changé de déclaration en dessous mais je n'ai pas fonctionné non plus.

ArrayList<String> s = new ArrayList<>(10)
9
Bala

L'indice ArrayList commence à partir de 0(Zero)

La taille de votre liste de tableaux est 0 et vous ajoutez un élément String au 1er index. Sans ajouter d'élément à l'index 0, vous ne pouvez pas ajouter les positions d'index suivantes. Ce qui est faux.

Alors, faites-le simplement comme

 s.add("Elephant");

Ou tu peux 

s.add(0,"Elephant");
5

Vous devez ajouter des éléments à ArrayList en série, à partir de 0, 1, etc. 

Si vous devez ajouter des éléments à une position spécifique, vous pouvez procéder comme suit: 

String[] strings = new String[5];
strings[1] = "Elephant";

List<String> s = Arrays.asList(strings);
System.out.println(s); 

Cela produira la sortie suivante

[null, Elephant, null, null, null]
4
Sohail

Votre ArrayList est vide. Avec cette ligne:

s.add(1,"Elephant");

Vous essayez d’ajouter "Elephant" à l’index 1 de la ArrayList (deuxième position), qui n’existe pas, ce qui jette donc une IndexOutOfBoundsException.

Utilisation

s.add("Elephant");

au lieu.

4
BackSlash

Pour Android:

Si vous devez utiliser une liste comportant de nombreux espaces vides, il est préférable d'utiliser SparseArray en termes de mémoire (une ArrayList aurait beaucoup d'entrées null). 

Exemple d'utilisation:

SparseArray<String> list = new SparseArray<>();
list.put(99, "string1");
list.put(23, "string2");
list.put(45, "string3");
  • Utilisez list.append() si vous ajoutez des clés séquentielles, telles que 1, 2, 3, 5, 7, 11, 13 ...
  • Utilisez list.put() si vous ajoutez des clés non séquentielles, telles que 100, 23, 45, 277, 42 ...

Si votre liste compte plus de centaines d’éléments, il est préférable d’utiliser HashMap , car les recherches nécessitent une recherche binaire et les ajouts et suppressions nécessitent d’insérer et de supprimer des entrées dans le tableau.

1
David Miguel

Si vous voulez VRAIMENT "Elephant" à l'index 1, vous pouvez ajouter une autre entrée (par exemple, null) à l'index 0.

public class App {
public static void main(String[] args) {
    ArrayList<String> s = new ArrayList<>();

    s.add(null);
    s.add("Elephant");

    System.out.println(s.size());                
  }
}

Ou modifiez les appels en .add pour spécifier null à l'index 0 et elephant à l'index 1.

1
jedison

N'ajoutez pas l'index comme 1 directement dans la liste Si vous souhaitez ajouter de la valeur dans une liste, ajoutez-le ainsi: S.add ("Elephant"); Par défaut, taille de la liste est 0 Si vous ajoutez des éléments à la liste, la taille augmentera automatiquement . Vous ne pouvez pas ajouter directement dans la liste du premier index. // s.add (0, "Elephant" )

0
veeru

add(int index, E element) API dit: Votre liste de tableaux a une taille nulle et vous ajoutez un élément au 1er index.

Jette:

IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

Utilisez boolean add(E e) à la place.

UPDATEbasé sur la question mise à jour

Je peux le faire fonctionner, mais j'essaie de comprendre les concepts, alors j'ai Changé la déclaration en bas mais je n'ai pas fonctionné non plus.

ArrayList<String> s = new ArrayList<>(10)

Lorsque vous appelez new ArrayList<Integer>(10), vous définissez la capacité initiale de la liste sur 10, et non sur sa taille. En d'autres termes, lorsqu'elle est construite de cette manière, la liste de tableaux commence sa vie vide.

0

Vous pouvez initialiser la taille (pas la capacité) d'un ArrayList de la manière suivante:

ArrayList<T> list = new ArrayList<T>(Arrays.asList(new T[size]));

dans ton cas:

ArrayList<String> s = new ArrayList<String>(Arrays.asList(new String[10]));

cela crée une ArrayList avec 10 éléments nuls, vous pouvez donc ajouter des éléments dans un ordre aléatoire dans la taille (index 0-9).

0
Bruno F

ArrayList n'est pas auto-extensible. Pour ajouter un élément à l'index 1, vous devez avoir l'élément # 0.

0
Denis Kulagin