87 votes

Comment ajouter dynamiquement des éléments à un tableau Java ?

En PHP, vous pouvez ajouter dynamiquement des éléments aux tableaux de la manière suivante :

$x = new Array();
$x[] = 1;
$x[] = 2;

Après ça, $x serait un tableau comme celui-ci : {1,2} .

Existe-t-il un moyen de faire quelque chose de similaire en Java ?

4 votes

Pour toutes les réponses ci-dessous utilise ArrayList mais OP demande spécifiquement pour Array. Je voudrais savoir aussi.

4 votes

La réponse est "non". Vous devez spécifier la taille du tableau (ou remplir tous les éléments) au moment de la déclaration/création en Java. Veuillez consulter java.sun.com/docs/books/jls/seconde_edition/html/arrays.doc.html

0 votes

J'ai remarqué que plusieurs fonctions Java renvoient des tableaux, alors j'ai regardé l'implémentation de list(filter) dans File.java. Elle utilise une liste en interne et la convertit en tableau à la fin. List<String> v = new ArrayList<>() ; ... return v.toArray(new String[v.size()]) ;

113voto

corsiKa Points 39442

Regardez java.util.LinkedList ou java.util.ArrayList.

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);

21 votes

C'est une réponse parfaite, sauf pour une pièce. Normalement, en Java, nous utilisons simplement des listes au lieu de tableaux primitifs, mais dans les cas où vous avez réellement besoin d'un tableau primitif (par exemple int[] ), il suffit d'utiliser le toArray() méthode sur la liste. Utilisez le code ci-dessus mais utilisez x.toArray() pour obtenir un tableau primitif.

1 votes

Dans 99% des cas (plutôt 99,99999% des cas), si vous avez réellement besoin d'un tableau primitif, vous faites quelque chose de mal, et il devrait être géré avec les principes OO. À moins que vous n'interfaciez avec du code natif, ou quelque chose comme Oracle ARRAY ou une autre bêtise de ce genre, il est préférable d'éviter les tableaux primitifs.

11 votes

Oh, tous ces commentaires sur le fait qu'il ne faut pas utiliser de tableaux primitifs, si seulement c'était aussi simple :(

67voto

Paŭlo Ebermann Points 35526

Les tableaux en Java ont une taille fixe, donc vous ne pouvez pas "ajouter quelque chose à la fin" comme vous pourriez le faire en PHP.

Le comportement est un peu similaire à celui de PHP :

int[] addElement(int[] org, int added) {
    int[] result = Arrays.copyOf(org, org.length +1);
    result[org.length] = added;
    return result;
}

Ensuite, vous pourrez écrire :

x = new int[0];
x = addElement(x, 1);
x = addElement(x, 2);

System.out.println(Arrays.toString(x));

Mais ce schéma est terriblement inefficace pour les tableaux de grande taille. car il fait une copie de l'ensemble du tableau à chaque fois. (Et ce n'est en fait pas complètement équivalent à PHP, puisque votre ancien tableau reste le même).

Les tableaux PHP sont en fait assez semblables à un HashMap Java avec une "clé max" ajoutée, afin de savoir quelle clé utiliser ensuite, et un ordre d'itération étrange (et une relation d'équivalence étrange entre les clés Integer et certaines Strings). Mais pour des collections indexées simples, il vaut mieux utiliser une liste en Java, comme l'ont proposé les autres répondants.

Si vous voulez éviter d'utiliser List En raison de la surcharge que représente l'encapsulation de chaque int dans un Integer, envisagez d'utiliser des réimplémentations de collections pour les types primitifs, qui utilisent des tableaux en interne, mais n'effectuent pas de copie à chaque modification, uniquement lorsque le tableau interne est plein (tout comme ArrayList). (Un exemple rapidement trouvé sur Google est cette classe IntList .)

La goyave contient les méthodes créant de tels wrappers sur Ints.asList , Longs.asList etc.

0 votes

C'est beaucoup plus intelligent que la solution acceptée. Pas de gaspillage d'objets.

2 votes

@Mihail : En fait, je ne recommande normalement pas de faire cela, puisque pour chaque ajout d'un élément, un nouveau tableau est créé et le contenu entier est copié. (Cela dépend de votre cas d'utilisation, cependant - si vous ajoutez/supprimez rarement quelque chose, et que vous itérez/recherchez souvent, cela pourrait être correct).

0 votes

ArrayUtils dans les nouvelles versions a une méthode qui fait cela. J'ai la flemme de vérifier l'implémentation, mais je suis presque sûr qu'ils l'ont bien écrite.

19voto

mist Points 810

Apache Commons dispose d'une ArrayUtils pour ajouter un élément à la fin du nouveau tableau :

/** Copies the given array and adds the given element at the end of the new array. */
public static <T> T[] add(T[] array, T element)

2 votes

Dans les ArrayUtils plus récents, c'est : ArrayUtils.appendElement(String.class, origArray, "nouvel élément")

11voto

tkeE2036 Points 3778

Vous pouvez utiliser un ArrayList et ensuite utiliser le toArray() méthode. Mais selon ce que vous faites, vous n'aurez peut-être même pas besoin d'un tableau. Cherchez à savoir si Lists sont plus ce que vous voulez.

Voir : Tutoriel Java sur les listes

5voto

Vous souhaitez probablement utiliser une ArrayList pour cela - pour une structure de type tableau à taille dynamique.

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