1596 Stimmen

Wie kann ich zwei Arrays in Java miteinander verknüpfen?

Ich muss zwei Dateien verketten String Arrays in Java.

void f(String[] first, String[] second) {
    String[] both = ???
}

Wie lässt sich dies am einfachsten bewerkstelligen?

188voto

rghome Punkte 7901

Sie können die beiden Arrays in zwei Codezeilen aneinanderhängen.

String[] both = Arrays.copyOf(first, first.length + second.length);
System.arraycopy(second, 0, both, first.length, second.length);

Dies ist eine schnelle und effiziente Lösung und funktioniert auch für primitive Typen, da die beiden beteiligten Methoden überladen sind.

Sie sollten Lösungen vermeiden, die ArrayLists, Streams usw. beinhalten, da diese temporären Speicher für keinen sinnvollen Zweck zuweisen müssen.

Sie sollten vermeiden for Schleifen für große Arrays, da diese nicht effizient sind. Die eingebauten Methoden verwenden Block-Kopierfunktionen, die extrem schnell sind.

61voto

Fabian Steeg Punkte 43903

Verwendung der Java-API:

String[] f(String[] first, String[] second) {
    List<String> both = new ArrayList<String>(first.length + second.length);
    Collections.addAll(both, first);
    Collections.addAll(both, second);
    return both.toArray(new String[both.size()]);
}

45voto

francois Punkte 11

Eine Lösung 100% altes Java y ohne System.arraycopy (nicht verfügbar in GWT-Client zum Beispiel):

static String[] concat(String[]... arrays) {
    int length = 0;
    for (String[] array : arrays) {
        length += array.length;
    }
    String[] result = new String[length];
    int pos = 0;
    for (String[] array : arrays) {
        for (String element : array) {
            result[pos] = element;
            pos++;
        }
    }
    return result;
}

35voto

volley Punkte 6555

Ich hatte in letzter Zeit Probleme mit übermäßiger Speicherrotation. Wenn a und/oder b bekanntermaßen häufig leer sind, ist hier eine weitere Anpassung des Codes von silvertab (ebenfalls generiert):

private static <T> T[] concatOrReturnSame(T[] a, T[] b) {
    final int alen = a.length;
    final int blen = b.length;
    if (alen == 0) {
        return b;
    }
    if (blen == 0) {
        return a;
    }
    final T[] result = (T[]) java.lang.reflect.Array.
            newInstance(a.getClass().getComponentType(), alen + blen);
    System.arraycopy(a, 0, result, 0, alen);
    System.arraycopy(b, 0, result, alen, blen);
    return result;
}

Edit: Eine frühere Version dieses Beitrags besagte, dass die Wiederverwendung von Arrays wie diese klar dokumentiert werden sollte. Wie Maarten in den Kommentaren anmerkt, wäre es im Allgemeinen besser, die if-Anweisungen einfach zu entfernen, wodurch die Notwendigkeit einer Dokumentation entfiele. Aber andererseits waren diese if-Anweisungen der eigentliche Grund für diese spezielle Optimierung. Ich lasse die Antwort hier stehen, aber seien Sie auf der Hut!

28voto

h-rai Punkte 3056
ArrayList<String> both = new ArrayList(Arrays.asList(first));
both.addAll(Arrays.asList(second));

both.toArray(new String[0]);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X