J'ai besoin de concaténer deux String
tableaux en Java.
void f(String[] first, String[] second) {
String[] both = ???
}
Quelle est la manière la plus simple de faire ça?
java
arrays
concatenation
add
Antti Kissaniemi
la source
la source
array1 + array2
concaténation.Réponses:
J'ai trouvé une solution en ligne de la bonne vieille bibliothèque Apache Commons Lang.
ArrayUtils.addAll(T[], T...)
Code:
la source
Voici une méthode simple qui concaténera deux tableaux et retournera le résultat:
Notez qu'il ne fonctionnera pas avec les types de données primitifs, uniquement avec les types d'objets.
La version suivante, légèrement plus compliquée, fonctionne avec les tableaux d'objets et les tableaux primitifs. Il le fait en utilisant
T
au lieu deT[]
comme type d'argument.Il permet également de concaténer des tableaux de deux types différents en choisissant le type le plus général comme type de composant du résultat.
Voici un exemple:
la source
Array.newInstance(a.getClass().getComponentType(), aLen + bLen);
. Je n'ai étonnamment jamais vu ça auparavant. @beaudet Je pense que l'annotation est très bien ici, vu pourquoi elle est supprimée.Il est possible d'écrire une version entièrement générique qui peut même être étendue pour concaténer n'importe quel nombre de tableaux. Ces versions nécessitent Java 6, car elles utilisent
Arrays.copyOf()
Les deux versions évitent de créer des
List
objets intermédiaires et les utilisentSystem.arraycopy()
pour garantir que la copie de grands tableaux est aussi rapide que possible.Pour deux tableaux, cela ressemble à ceci:
Et pour un nombre arbitraire de tableaux (> = 1), cela ressemble à ceci:
la source
T
parbyte
(et perdez le<T>
).ByteBuffer buffer = ByteBuffer.allocate(array1.length + array2.length); buffer.put(array1); buffer.put(array2); return buffer.array();
concat(ai, ad)
, oùai
estInteger[]
etad
estDouble[]
. (Dans ce cas, le paramètre type<T>
est résolu<? extends Number>
par le compilateur.) Le tableau créé parArrays.copyOf
aura le type de composant du premier tableau, c'est-Integer
à- dire dans cet exemple. Lorsque la fonction est sur le point de copier le deuxième tableau, unArrayStoreException
sera lancé. La solution est d'avoir unClass<T> type
paramètre supplémentaire .Utilisation
Stream
en Java 8:Ou comme ça, en utilisant
flatMap
:Pour ce faire, pour un type générique, vous devez utiliser la réflexion:
la source
.boxed()
afin qu'ils soient de typeStream
plutôt que par exempleIntStream
qui ne peuvent pas être passés en paramètre àStream.concat
.a
etb
êtesint[]
, utilisezint[] both = IntStream.concat(Arrays.stream(a), Arrays.stream(b)).toArray();
System.arrayCopy
. Mais pas particulièrement lent non plus. Vous devrez probablement le faire très souvent avec des tableaux énormes dans des contextes très sensibles aux performances pour que la différence de temps d'exécution soit importante.Ou avec la bien-aimée Goyave :
Il existe également des versions pour les tableaux primitifs:
Booleans.concat(first, second)
Bytes.concat(first, second)
Chars.concat(first, second)
Doubles.concat(first, second)
Shorts.concat(first, second)
Ints.concat(first, second)
Longs.concat(first, second)
Floats.concat(first, second)
la source
Vous pouvez ajouter les deux tableaux dans deux lignes de code.
Il s'agit d'une solution rapide et efficace qui fonctionnera pour les types primitifs ainsi que les deux méthodes impliquées sont surchargées.
Vous devez éviter les solutions impliquant des listes de tableaux, des flux, etc. car celles-ci devront allouer de la mémoire temporaire sans but utile.
Vous devez éviter les
for
boucles pour les grands tableaux car ceux-ci ne sont pas efficaces. Les méthodes intégrées utilisent des fonctions de copie de blocs extrêmement rapides.la source
Utilisation de l'API Java:
la source
both.toArray(new String[0])
sera plus rapide queboth.toArray(new String[both.size()])
, même si elle contredit notre intuition naïve. C'est pourquoi il est si important de mesurer les performances réelles lors de l'optimisation. Ou utilisez simplement la construction plus simple, lorsque l'avantage de la variante plus compliquée ne peut pas être prouvé.Une solution 100% java ancienne et sans
System.arraycopy
(non disponible dans le client GWT par exemple):la source
null
chèques. Et peut-être définir certaines de vos variablesfinal
.null
vérifications @TrippKinetics masqueraient les NPE plutôt que de les afficher et l'utilisation de final pour les var locales n'a aucun avantage (pour l'instant).J'ai récemment combattu des problèmes de rotation excessive de la mémoire. Si a et / ou b sont connus pour être généralement vides, voici une autre adaptation du code de silvertab (également généré):
Edit: Une version précédente de ce message a déclaré que la réutilisation de la baie comme celle-ci doit être clairement documentée. Comme le souligne Maarten dans les commentaires, il serait généralement préférable de simplement supprimer les instructions if, ce qui rendrait inutile la documentation. Mais là encore, ces déclarations if étaient le point entier de cette optimisation particulière en premier lieu. Je vais laisser cette réponse ici, mais méfiez-vous!
la source
System.arraycopy
le contenu du tableau était copié?if
simple fait de laisser de côté les deux déclarations serait la solution la plus simple.La bibliothèque Java fonctionnelle possède une classe d'encapsuleur de tableaux qui équipe les tableaux de méthodes pratiques comme la concaténation.
...et alors
Pour récupérer le tableau déballé, appelez
la source
la source
both.toArray(new String[both.size()])
Une autre façon avec Java8 en utilisant Stream
la source
Voici une adaptation de la solution de silvertab, avec des génériques modernisés:
REMARQUE: voir la réponse de Joachim pour une solution Java 6. Non seulement cela élimine l'avertissement; il est également plus court, plus efficace et plus facile à lire!
la source
Si vous utilisez cette méthode, vous n'avez donc pas besoin d'importer de classe tierce.
Si vous voulez concaténer
String
Exemple de code pour concéder deux tableaux de chaînes
Si vous voulez concaténer
Int
Exemple de code pour concéder deux tableaux entiers
Voici la méthode principale
Nous pouvons également utiliser cette méthode.
la source
Veuillez me pardonner d'avoir ajouté une autre version à cette liste déjà longue. J'ai regardé chaque réponse et j'ai décidé que je voulais vraiment une version avec un seul paramètre dans la signature. J'ai également ajouté quelques vérifications d'arguments pour bénéficier d'un échec précoce avec des informations sensibles en cas d'entrée inattendue.
la source
Vous pouvez essayer de le convertir en Arraylist et utiliser la méthode addAll puis reconvertir en tableau.
la source
En utilisant les flux Java 8+, vous pouvez écrire la fonction suivante:
la source
Voici une implémentation possible en code de travail de la solution de pseudo code écrite par silvertab.
Merci silvertab!
Voici ensuite l'interface du générateur.
Remarque: Un constructeur est nécessaire car en java il n'est pas possible de faire
new T[size]
en raison de l'effacement de type générique:
Voici un constructeur concret implémentant l'interface, construisant un
Integer
tableau:Et enfin l'application / test:
la source
Cela devrait être une ligne.
la source
Hou la la! beaucoup de réponses complexes ici, y compris des réponses simples qui dépendent de dépendances externes. que diriez-vous de faire comme ça:
la source
Cela fonctionne, mais vous devez insérer votre propre vérification d'erreur.
Ce n'est probablement pas le plus efficace, mais il ne repose sur rien d'autre que la propre API de Java.
la source
for
boucle par celle-ci:for(int j = 0; j < arr2.length; j++){arrBoth[arr1.length+j] = arr2[j];}
String[] arrBoth = java.util.Arrays.copyOf(arr1, arr1.length + arr2.length)
pour sauter la premièrefor
boucle. Gain de temps proportionnel à la taille dearr1
.Il s'agit d'une fonction convertie pour un tableau String:
la source
Que diriez-vous simplement
Et fais-le
Array.concat(arr1, arr2)
. Tant quearr1
etarr2
sont du même type, cela vous donnera un autre tableau du même type contenant les deux tableaux.la source
Une version statique générique qui utilise le System.arraycopy très performant sans nécessiter une annotation @SuppressWarnings:
la source
la source
Voici ma version légèrement améliorée de concatAll de Joachim Sauer. Il peut fonctionner sur Java 5 ou 6, en utilisant System.arraycopy de Java 6 s'il est disponible au moment de l'exécution. Cette méthode (à mon humble avis) est parfaite pour Android, car elle fonctionne sur Android <9 (qui n'a pas System.arraycopy) mais utilisera la méthode la plus rapide si possible.
la source
Une autre façon de penser la question. Pour concaténer deux tableaux ou plus, il suffit de répertorier tous les éléments de chaque tableau, puis de créer un nouveau tableau. Cela ressemble à créer un
List<T>
, puis l'appelletoArray
. Certaines autres réponses sont utilesArrayList
, et c'est très bien. Mais que diriez-vous de mettre en œuvre le nôtre? Ce n'est pas difficile:Je crois que ce qui précède est équivalent aux solutions qui utilisent
System.arraycopy
. Cependant, je pense que celui-ci a sa propre beauté.la source
Que diriez-vous :
la source
Une variante simple permettant la jonction de plus d'un tableau:
la source
Utiliser uniquement la propre API de Javas:
Maintenant, ce code n'est pas le plus efficace, mais il ne repose que sur les classes java standard et est facile à comprendre. Cela fonctionne pour n'importe quel nombre de String [] (même zéro tableau).
la source