364 votes

Comment ajouter de nouveaux éléments à un tableau ?

J'ai le code suivant :

String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");

Ces deux appendices ne compilent pas. Comment cela pourrait-il fonctionner correctement ?

7 votes

Bien que cette question ait +10 ans et qu'il soit important de comparer les différences entre les listes et les tableaux, il est étonnant de constater à quel point j'ai dû me creuser la tête pour trouver comment obtenir un tableau résultant avec un nouvel élément ajouté, comme le demandait initialement le PO.

467voto

tangens Points 17733

La taille d'un tableau ne peut pas être modifiée. Si vous voulez un tableau plus grand, vous devez en instancier un nouveau.

Une meilleure solution serait d'utiliser un ArrayList qui peut évoluer en fonction de vos besoins. La méthode ArrayList.toArray( T[] a ) vous rend votre tableau si vous en avez besoin sous cette forme.

List<String> where = new ArrayList<String>();
where.add( ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1" );
where.add( ContactsContract.Contacts.IN_VISIBLE_GROUP+"=1" );

Si vous avez besoin de le convertir en un simple tableau...

String[] simpleArray = new String[ where.size() ];
where.toArray( simpleArray );

Mais la plupart des choses que vous faites avec un tableau, vous pouvez les faire avec cette ArrayList, aussi :

// iterate over the array
for( String oneItem : where ) {
    ...
}

// get specific items
where.get( 1 );

11 votes

Quel est l'intérêt d'utiliser Array si on peut faire la même chose avec ArrayList ?

0 votes

Je suis nouveau sur Android mais votre réponse m'a aidé. Avant de trouver la réponse, j'ai perdu de nombreuses heures.

7 votes

@Skoua Les tableaux sont plus efficaces. La prédéfinition de la taille de l'objet permet au compilateur d'optimiser la mémoire. Pour certaines applications, c'est important. Une petite application fonctionnant sur un ordinateur moderne peut probablement s'en sortir avec un grand nombre de listes avant que la mémoire ne devienne un problème.

121voto

polygenelubricants Points 136838

Utilisez un List<String> comme un ArrayList<String> . Il est dynamiquement extensible, contrairement aux tableaux (voir : Effective Java 2e édition, point 25 : préférer les listes aux tableaux. ).

import java.util.*;
//....

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list); // prints "[1, 2, 3]"

Si vous insistez pour utiliser des tableaux, vous pouvez utiliser java.util.Arrays.copyOf d'allouer un tableau plus grand pour accueillir l'élément supplémentaire. Mais ce n'est pas vraiment la meilleure solution.

static <T> T[] append(T[] arr, T element) {
    final int N = arr.length;
    arr = Arrays.copyOf(arr, N + 1);
    arr[N] = element;
    return arr;
}

String[] arr = { "1", "2", "3" };
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3]"
arr = append(arr, "4");
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3, 4]"

C'est O(N) par append . ArrayList d'autre part, a O(1) coût amorti par opération.

Voir aussi

0 votes

Vous pouvez doubler la taille du tableau chaque fois que la capacité n'est pas suffisante. De cette façon, l'append sera amorti O(1). Probablement ce que ArrayList fait en interne.

15voto

Robert Points 3044

Il n'y a pas de méthode append() sur les tableaux. Au lieu de cela, comme cela a déjà été suggéré, un objet Liste peut répondre au besoin d'insérer dynamiquement des éléments, par exemple.

List<String> where = new ArrayList<String>();
where.add(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.add(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");

Ou si vous tenez vraiment à utiliser un tableau :

String[] where = new String[]{
    ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1",
    ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1"
};

mais il s'agit alors d'une taille fixe et aucun élément ne peut être ajouté.

0 votes

Une requête paramétrée accepte-t-elle également les ArrayList comme selectionArgs ?

9voto

Simon Points 5327

Comme l'a dit Tangens, la taille d'un tableau est fixe. Mais vous devez d'abord l'instancier, sinon il ne sera qu'une référence nulle.

String[] where = new String[10];

Ce tableau ne peut contenir que 10 éléments. Vous ne pouvez donc ajouter une valeur que 10 fois. Dans votre code, vous accédez à une référence nulle. C'est pourquoi cela ne fonctionne pas. Afin d'avoir une collection qui croît dynamiquement, utilisez ArrayList.

5voto

Paligulus Points 203

Vous devez utiliser une liste de collection. Vous ne pouvez pas redimensionner un tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X