Ich muss zwei String
Arrays in Java verketten .
void f(String[] first, String[] second) {
String[] both = ???
}
Was ist der einfachste Weg, dies zu tun?
java
arrays
concatenation
add
Antti Kissaniemi
quelle
quelle
array1 + array2
Verkettung erhalten hat.Antworten:
Ich habe eine einzeilige Lösung aus der guten alten Apache Commons Lang-Bibliothek gefunden.
ArrayUtils.addAll(T[], T...)
Code:
quelle
Hier ist eine einfache Methode, die zwei Arrays verkettet und das Ergebnis zurückgibt:
Beachten Sie, dass dies nicht mit primitiven Datentypen funktioniert, sondern nur mit Objekttypen.
Die folgende etwas kompliziertere Version funktioniert sowohl mit Objekt- als auch mit primitiven Arrays. Dies geschieht durch Verwendung von
T
anstelle vonT[]
als Argumenttyp.Es ist auch möglich, Arrays von zwei verschiedenen Typen zu verketten, indem der allgemeinste Typ als Komponententyp des Ergebnisses ausgewählt wird.
Hier ist ein Beispiel:
quelle
Array.newInstance(a.getClass().getComponentType(), aLen + bLen);
. Ich habe das überraschenderweise noch nie gesehen. @beaudet Ich denke, die Anmerkung ist hier in Ordnung, wenn man bedenkt, warum sie unterdrückt wird.Es ist möglich, eine vollständig generische Version zu schreiben, die sogar erweitert werden kann, um eine beliebige Anzahl von Arrays zu verketten. Diese Versionen erfordern Java 6, wie sie verwenden
Arrays.copyOf()
Beide Versionen vermeiden das Erstellen von Zwischenobjekten
List
und stellenSystem.arraycopy()
sicher, dass das Kopieren großer Arrays so schnell wie möglich erfolgt.Für zwei Arrays sieht es so aus:
Und für eine beliebige Anzahl von Arrays (> = 1) sieht es so aus:
quelle
T
durchbyte
(und verlieren Sie den<T>
).ByteBuffer buffer = ByteBuffer.allocate(array1.length + array2.length); buffer.put(array1); buffer.put(array2); return buffer.array();
concat(ai, ad)
woai
istInteger[]
undad
istDouble[]
. (In diesem Fall wird die Typ - Parameter<T>
werden gelöst<? extends Number>
durch den Compiler.) Das Array erstellt vonArrays.copyOf
dem Komponententyp des ersten Arrays, dhInteger
in diesem Beispiel. Wenn die Funktion das zweite Array kopierenArrayStoreException
will , wird ein ausgelöst. Die Lösung besteht darin, einen zusätzlichenClass<T> type
Parameter zu haben .Verwenden
Stream
in Java 8:Oder so mit
flatMap
:Um dies für einen generischen Typ zu tun, müssen Sie Reflection verwenden:
quelle
.boxed()
dass sie vom Typ sindStream
und nicht z. B.,IntStream
die nicht als Parameter an übergeben werden könnenStream.concat
.a
undb
sindint[]
, verwenden Sieint[] both = IntStream.concat(Arrays.stream(a), Arrays.stream(b)).toArray();
System.arrayCopy
. Aber auch nicht besonders langsam. Sie müssen dies wahrscheinlich sehr oft mit riesigen Arrays in wirklich leistungsempfindlichen Kontexten tun, damit der Unterschied in der Ausführungszeit eine Rolle spielt.Oder mit der geliebten Guave :
Es gibt auch Versionen für primitive Arrays:
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)
quelle
Sie können die beiden Arrays in zwei Codezeilen anhängen.
Dies ist eine schnelle und effiziente Lösung und funktioniert sowohl für primitive Typen als auch für die beiden beteiligten Methoden.
Sie sollten Lösungen mit ArrayLists, Streams usw. vermeiden, da diese temporären Speicher ohne nützlichen Zweck zuweisen müssen.
Sie sollten
for
Schleifen für große Arrays vermeiden, da diese nicht effizient sind. Die integrierten Methoden verwenden Blockkopierfunktionen, die extrem schnell sind.quelle
Verwenden der Java-API:
quelle
both.toArray(new String[0])
schneller alsboth.toArray(new String[both.size()])
, auch wenn dies unserer naiven Intuition widerspricht. Deshalb ist es so wichtig, die tatsächliche Leistung bei der Optimierung zu messen. Oder verwenden Sie einfach das einfachere Konstrukt, wenn der Vorteil der komplizierteren Variante nicht nachgewiesen werden kann.Eine Lösung aus 100% altem Java und ohne
System.arraycopy
(zum Beispiel im GWT-Client nicht verfügbar):quelle
null
Schecks hinzufügen . Und vielleicht setzen Sie einige Ihrer Variablen auffinal
.null
Überprüfungen würden NPEs verbergen, anstatt sie anzuzeigen , und die Verwendung von final für lokale Variablen hat (noch) keinen Vorteil.Ich habe kürzlich Probleme mit übermäßiger Speicherrotation bekämpft. Wenn bekannt ist, dass a und / oder b häufig leer sind, finden Sie hier eine weitere Anpassung des silvertab-Codes (ebenfalls generiert):
Bearbeiten: In einer früheren Version dieses Beitrags wurde angegeben, dass eine solche Wiederverwendung von Arrays klar dokumentiert werden muss. Wie Maarten in den Kommentaren ausführt, ist es im Allgemeinen besser, nur die if-Anweisungen zu entfernen, wodurch die Notwendigkeit einer Dokumentation entfällt. Andererseits waren diese if-Aussagen in erster Linie der springende Punkt dieser speziellen Optimierung. Ich werde diese Antwort hier lassen, aber seien Sie vorsichtig!
quelle
System.arraycopy
kopiert den Inhalt des Arrays?if
Aussagen wegzulassen, wäre die einfachste Lösung.Die Functional Java- Bibliothek verfügt über eine Array-Wrapper-Klasse, die Arrays mit praktischen Methoden wie Verkettung ausstattet.
...und dann
Rufen Sie an, um das ausgepackte Array wieder herauszuholen
quelle
quelle
both.toArray(new String[both.size()])
;)Ein anderer Weg mit Java8 unter Verwendung von Stream
quelle
Hier ist eine Anpassung der Lösung von silvertab mit nachgerüsteten Generika:
HINWEIS: Siehe Joachims Antwort für eine Java 6-Lösung. Es beseitigt nicht nur die Warnung; es ist auch kürzer, effizienter und leichter zu lesen!
quelle
Wenn Sie diese Methode verwenden, müssen Sie keine Klasse von Drittanbietern importieren.
Wenn Sie verketten möchten
String
Beispielcode für Concate Two String Array
Wenn Sie verketten möchten
Int
Beispielcode für zwei ganzzahlige Ganzzahl-Arrays
Hier ist die Hauptmethode
Wir können diesen Weg auch benutzen.
quelle
Bitte verzeihen Sie mir, dass ich dieser bereits langen Liste noch eine weitere Version hinzugefügt habe. Ich sah mir jede Antwort an und entschied, dass ich wirklich eine Version mit nur einem Parameter in der Signatur haben wollte. Ich habe auch einige Argumentprüfungen hinzugefügt, um von einem frühen Ausfall mit vernünftigen Informationen bei unerwarteten Eingaben zu profitieren.
quelle
Sie können versuchen, es in eine Arraylist zu konvertieren, die addAll-Methode verwenden und dann wieder in ein Array konvertieren.
quelle
Mit Java 8+ Streams können Sie die folgende Funktion schreiben:
quelle
Hier eine mögliche Implementierung der von silvertab geschriebenen Pseudocode-Lösung in den Arbeitscode.
Danke silvertab!
Als nächstes folgt die Builder-Oberfläche.
Hinweis: Ein Builder ist erforderlich, da dies in Java nicht möglich ist
new T[size]
aufgrund der generischen Löschung:
Hier ein konkreter Builder, der die Schnittstelle implementiert und ein
Integer
Array erstellt:Und zum Schluss die Anwendung / der Test:
quelle
Dies sollte einzeilig sein.
quelle
Beeindruckend! Viele komplexe Antworten hier, einschließlich einiger einfacher, die von externen Abhängigkeiten abhängen. wie wäre es so:
quelle
Dies funktioniert, aber Sie müssen Ihre eigene Fehlerprüfung einfügen.
Es ist wahrscheinlich nicht das effizienteste, aber es basiert auf nichts anderem als Javas eigener API.
quelle
for
Schleife durch folgende zu ersetzen :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)
diese Option, um die erstefor
Schleife zu überspringen . Spart Zeit proportional zur Größe vonarr1
.Dies ist eine konvertierte Funktion für ein String-Array:
quelle
Wie wäre es einfach
Und mach es einfach
Array.concat(arr1, arr2)
. Solangearr1
undarr2
vom selben Typ sind, erhalten Sie ein weiteres Array desselben Typs, das beide Arrays enthält.quelle
Eine generische statische Version, die die leistungsstarke System.arraycopy verwendet, ohne dass eine @ SuppressWarnings-Annotation erforderlich ist:
quelle
quelle
Hier ist meine leicht verbesserte Version von Joachim Sauers concatAll. Es kann unter Java 5 oder 6 mit System.arraycopy von Java 6 verwendet werden, wenn es zur Laufzeit verfügbar ist. Diese Methode (IMHO) ist perfekt für Android, da sie unter Android <9 (ohne System.arraycopy) funktioniert, aber wenn möglich die schnellere Methode verwendet.
quelle
Eine andere Art, über die Frage nachzudenken. Um zwei oder mehr Arrays zu verketten, müssen Sie alle Elemente jedes Arrays auflisten und dann ein neues Array erstellen. Das klingt so, als würde man ein erstellen
List<T>
und es dann aufrufentoArray
. Einige andere Antworten verwendenArrayList
, und das ist in Ordnung. Aber wie wäre es mit einer eigenen Implementierung? Es ist nicht schwer:Ich glaube, dass das oben Genannte den Lösungen entspricht, die verwendet werden
System.arraycopy
. Ich denke jedoch, dass dieser seine eigene Schönheit hat.quelle
Wie wäre es mit :
quelle
Eine einfache Variante, die das Zusammenfügen von mehr als einem Array ermöglicht:
quelle
Verwenden Sie nur die Javas-eigene API:
Dieser Code ist nicht der effizienteste, basiert jedoch nur auf Standard-Java-Klassen und ist leicht zu verstehen. Es funktioniert für eine beliebige Anzahl von String [] (sogar Null-Arrays).
quelle