Ich habe zwei Sammlungen - eine ArrayList und einen Stack. Ich benutze den Stack, weil ich ein paar einfache Pop/Push-Funktionen für diesen Code benötigt habe. Die ArrayList ist im Wesentlichen die out-Variable, da dies ein kleiner Codeabschnitt in der Funktion ist.Der effizienteste Weg, einen Stack umzukehren und zu einer ArrayList hinzuzufügen
So werden die Variablen als solche definiert, dann wird Code ausgeführt Elemente zu dem Stapel hinzuzufügen.
ArrayList<String> out = new ArrayList<String>();
/* other code.. */
Stack<String> lineStack = new Stack<String>();
/* code that adds stuff to the stack */
Die Frage ist jetzt, dass ich ein voll bestücktes Stapel haben, wie ich es in der aus Arraylist in umgekehrter Reihenfolge dann aus dem Pop Auftrag vergeben haben.
Mein erster Gedanke up-Lösung war
while(!lineStack.empty()) {
out.add(0, lineStack.pop());
}
... das funktioniert, aber ich mache mir Sorgen um die Effizienz zu Beginn des Arraylist ein Element der Zugabe (die alle vorhandenen Elemente zwingt, müssen zu verschieben. Es ist eine verknüpfte Liste (glaube ich) .. große Sache .. aber immer noch ein Anliegen). Außerdem führe ich das durch eine Schleife ... vielleicht unnötig.
meine zweite Lösung also, die nicht beinhalten looping (zumindest in meinem Code, ich bin sicher, dass die Back-End-Anrufe es tun).
List l = lineStack.subList(0, lineStack.size());
out.addAll(l);
Ich weiß, dass ich die Liste nicht zuordnen muss, aber es wird für saubereren Code behalten. Ich bin mir jedoch nicht sicher, ob mir das einen besonders nützlichen Leistungsgewinn bringt.
Also, meine Frage ist: Welche davon wird mittlere Größe Sätze wahrscheinlich am effizientesten für SMALL zu? Wenn es eine effizientere Lösung gibt, welche wäre es?
zum Anfang Hinzufügen von 'ArrayList' ist teuer; Es ist eine 'ArrayList' und keine' LinkedList'. Hinzufügen zum Anfang ist "O (n^2)". – notnoop
Bitte beachten Sie, dass 'Stack' eine Unterklasse von' Vector' ist (die der 'ArrayList' ähnelt). Während entladen, vielleicht können Sie es einfach als "Vector", anstatt die Liste zu kopieren. – notnoop
Das habe ich mir gedacht. Stellt sich heraus, ich gehe nur mit der out.addAll (lineStack) -Methode. Ich muss es nicht einmal in ein Listenobjekt verwandeln. Das ist unnötiger Aufwand. Der Iterator des Stacks wird die richtige Richtung spielen, obwohl er ein Stack ist. –