web-dev-qa-db-fra.com

Comment ajouter un élément à la fin d'un tableau?

Je veux savoir comment ajouter ou ajouter un nouvel élément à la fin d'un tableau. Existe-t-il un moyen simple d'ajouter l'élément à la fin? Je sais comment utiliser un StringBuffer mais je ne sais pas comment l'utiliser pour ajouter un élément dans un tableau. Je le préfère sans ArrayList ou liste. Je me demande si le StringBuffer fonctionnera sur des entiers.

8
Jeffrey Zong

Vous ne pouvez pas ajouter d'élément à un tableau, car les tableaux, en Java, sont de longueur fixe. Cependant, vous pouvez créer un nouveau tableau à partir de celui existant en utilisant Arrays.copyOf(array, size) :

public static void main(String[] args) {
    int[] array = new int[] {1, 2, 3};
    System.out.println(Arrays.toString(array));
    array = Arrays.copyOf(array, array.length + 1); //create new array from old array and allocate one more element
    array[array.length - 1] = 4;
    System.out.println(Arrays.toString(array));
}

Je recommanderais toujours de ne plus travailler avec un tableau et d'utiliser un List .

8
Tunaki

Les tableaux en Java ont une longueur fixe qui ne peut pas être modifiée. Donc Java fournit des classes qui vous permettent de maintenir des listes de longueur variable.

Généralement, il existe l'interface List<T>, Qui représente une liste d'instances de la classe T. L'implémentation la plus simple et la plus utilisée est la ArrayList. Voici un exemple:

List<String> words = new ArrayList<String>();
words.add("Hello");
words.add("World");
words.add("!");

List.add() ajoute simplement un élément à la liste et vous pouvez obtenir la taille d'une liste en utilisant List.size().

3
MinecraftShamrock

L'OP dit, pour des raisons inconnues, "Je le préfère sans liste ni liste".

Si le type auquel vous faites référence est une primitive (vous mentionnez des entiers, mais vous ne dites pas si vous voulez dire int ou Integer), alors vous pouvez utiliser l'une des classes NIO Buffer comme Java.nio.IntBuffer . Ils agissent un peu comme StringBuffer - ils agissent comme des tampons pour une liste du type primitif (des tampons existent pour toutes les primitives mais pas pour les objets), et vous pouvez enrouler un tampon autour d'un tableau et/ou extraire un tableau à partir d'un tampon.

Notez que les javadocs disent: "La capacité d'un tampon n'est jamais négative et ne change jamais." C'est toujours juste un wrapper autour d'un tableau, mais c'est plus agréable à utiliser. La seule façon d'étendre efficacement un tampon est de allocate() un plus grand et d'utiliser put() pour vider l'ancien tampon dans le nouveau.

Si ce n'est pas une primitive, vous devriez probablement simplement utiliser List, ou trouver une raison convaincante pour laquelle vous ne pouvez pas ou ne voudrez pas, et peut-être que quelqu'un vous aidera à le contourner.

1
dcsohl

Comme beaucoup d'autres l'ont souligné si vous essayez d'ajouter un nouvel élément à la fin de la liste, alors quelque chose comme, array [array.length-1] = x; devrait faire. Mais cela remplacera l'élément existant.

Pour quelque chose comme un ajout continu au tableau. Vous pouvez garder une trace de l'index et continuer d'ajouter des éléments jusqu'à ce que vous atteigniez la fin et que la fonction qui fait l'addition vous renvoie l'index suivant, qui à son tour vous dira combien d'éléments supplémentaires peuvent tenir dans le tableau.

Bien sûr, dans les deux cas, la taille du tableau sera prédéfinie. Le vecteur peut être votre autre option car vous ne voulez pas d'arraylist, qui vous permettra toutes les mêmes caractéristiques et fonctions et se chargera en outre d'augmenter la taille.

Arriver à la partie où vous voulez que StringBuffer soit mis en tableau. Je crois que ce que vous recherchez est la méthode getChars (int srcBegin, int srcEnd, char [] dst, int dstBegin). Examinez-le qui pourrait résoudre vos doutes. Encore une fois, je voudrais souligner qu'après avoir réussi à en extraire un tableau, vous ne pouvez toujours remplacer que le dernier élément existant (caractère dans ce cas).

1
happyHelper

Pour clarifier le droit de terminologie: les tableaux sont des structures de longueur fixe (et la longueur d'un existant ne peut pas être modifiée) l'expression ajouter à la fin n'a pas de sens (en soi).

Ce que vous pouvez faire est de créer un nouveau tableau un élément plus grand et de remplir le nouvel élément dans le dernier emplacement:

public static int[] append(int[] array, int value) {
     int[] result = Arrays.copyOf(array, array.length + 1);
     result[result.length - 1] = value;
     return result;
}

Cela devient rapidement inefficace, car chaque fois qu'un ajout est appelé, un nouveau tableau est créé et l'ancien contenu du tableau est copié.

Une façon de réduire considérablement les frais généraux est de créer un plus grand tableau et de garder une trace de jusqu'à quel index il est réellement rempli. Ajouter un élément devient aussi simple que de remplir l'index suivant et d'incrémenter l'index. Si le tableau se remplit complètement, un nouveau tableau est créé avec plus d'espace libre.

Et devinez ce que fait ArrayList: exactement cela. Ainsi, lorsqu'un tableau de taille dynamique est nécessaire, ArrayList est un bon choix. Ne réinventez pas la roue.

0
Durandal