Ich könnte das nur mit String machen, zum Beispiel:
String str="";
for(int i=0;i<100;i++){
str=i+str;
}
Gibt es eine Möglichkeit, dies mit StringBuilder zu erreichen? Vielen Dank.
StringBuilder sb = new StringBuilder();
for(int i=0;i<100;i++){
sb.insert(0, Integer.toString(i));
}
Warnung: Es macht den Zweck von zunichteStringBuilder
, aber es tut, was Sie gefragt haben.
Bessere Technik (obwohl immer noch nicht ideal):
StringBuilder
.StringBuilder
wenn Sie fertig sind.Dies wird wiederum eine O ( n ²) Lösung in O ( n ).
AbstractStringBuilder
gesamte Inhalt über den Einfügeindex hinaus verschoben wird, um Platz für die eingefügten zu finden. Dies ist jedoch ein Implementierungsdetail, kein Prinzip.Sie können verwenden
strbuilder.insert(0,i);
quelle
Vielleicht fehlt mir etwas, aber Sie möchten mit einem String enden, der so aussieht
"999897969594...543210"
, richtig?quelle
Als alternative Lösung können Sie eine LIFO-Struktur (wie einen Stapel) verwenden, um alle Zeichenfolgen zu speichern. Wenn Sie fertig sind, nehmen Sie sie einfach heraus und fügen Sie sie in den StringBuilder ein. Es kehrt natürlich die Reihenfolge der darin platzierten Elemente (Zeichenfolgen) um.
quelle
ArrayDeque
sollte anstelle von verwendet werdenStack
. "Ein vollständigerer und konsistenterer Satz von LIFO-Stapeloperationen wird durch die {@link Deque} -Schnittstelle und ihre Implementierungen bereitgestellt, die dieser Klasse vorgezogen werden sollten."Dieser Thread ist ziemlich alt, aber Sie könnten auch über eine rekursive Lösung nachdenken, die den StringBuilder zum Füllen übergibt. Dies ermöglicht es, eine umgekehrte Verarbeitung usw. zu verhindern. Sie müssen lediglich Ihre Iteration mit einer Rekursion entwerfen und sorgfältig für eine Beendigungsbedingung entscheiden.
quelle
Ich hatte eine ähnliche Anforderung, als ich über diesen Beitrag stolperte. Ich wollte einen schnellen Weg, um einen String zu bauen, der von beiden Seiten wachsen kann, dh. Fügen Sie beliebig neue Buchstaben auf der Vorder- und Rückseite hinzu. Ich weiß, dass dies ein alter Beitrag ist, aber er hat mich dazu inspiriert, einige Möglichkeiten zum Erstellen von Zeichenfolgen auszuprobieren, und ich dachte, ich würde meine Erkenntnisse teilen. Ich verwende hier auch einige Java 8-Konstrukte, die in den Fällen 4 und 5 die Geschwindigkeit hätten optimieren können.
https://gist.github.com/SidWagz/e41e836dec65ff24f78afdf8669e6420
Das obige Gist enthält den detaillierten Code, den jeder ausführen kann. Ich habe nur wenige Möglichkeiten gewählt, um die Saiten zu vergrößern. 1) An StringBuilder anhängen, 2) An die Vorderseite von StringBuilder einfügen, wie von @Mehrdad gezeigt, 3) Teilweise von vorne sowie am Ende des StringBuilder einfügen, 4) Verwenden einer Liste zum Anhängen von Ende an, 5) Verwenden einer Deque an von vorne anhängen.
Ich werde mich auf die Vorderseite konzentrieren und nur Fälle anhängen, dh. Fall 2 und Fall 5. Die Implementierung von StringBuilder entscheidet intern darüber, wie der interne Puffer wächst, was abgesehen davon, dass der gesamte Puffer im Falle eines Frontanhangs von links nach rechts verschoben wird, die Geschwindigkeit begrenzt. Während die Zeit, die beim direkten Einfügen in die Vorderseite des StringBuilder benötigt wird, auf sehr hohe Werte ansteigt, wie von @Mehrdad gezeigt, wird die vordere Einfügung verwendet, wenn nur Zeichenfolgen mit einer Länge von weniger als 90.000 Zeichen benötigt werden (was immer noch viel ist) Erstellen Sie einen String in der gleichen Zeit, die zum Erstellen eines Strings mit derselben Länge erforderlich ist, indem Sie ihn am Ende anhängen. Was ich damit sagen will ist, dass die Zeitstrafe in der Tat tritt und riesig ist, aber nur, wenn man wirklich große Saiten bauen muss. Man könnte eine Deque verwenden und die Strings am Ende verbinden, wie in meinem Beispiel gezeigt.
Tatsächlich ist die Leistung für Fall 2 viel schneller als für Fall 1, was ich nicht zu verstehen scheine. Ich gehe davon aus, dass das Wachstum für den internen Puffer in StringBuilder im Fall von Front Append und Back Append gleich ist. Ich habe sogar den minimalen Heap auf einen sehr großen Wert festgelegt, um Verzögerungen beim Heap-Wachstum zu vermeiden, wenn dies eine Rolle gespielt hätte. Vielleicht kann jemand, der ein besseres Verständnis hat, unten einen Kommentar abgeben.
quelle
quelle
Sie können die Einfügemethode mit dem Versatz verwenden. Wenn der Versatz auf '0' gesetzt ist, werden Sie an die Vorderseite Ihres StringBuilder angehängt.
HINWEIS : Da die Einfügemethode alle Arten von Grundelementen akzeptiert, können Sie sie für int, long, char [] usw. verwenden.
quelle
Wie wäre es mit:
ODER
Aber damit machen Sie die Operation O (N ^ 2) anstelle von O (N).
Ausschnitt aus Java-Dokumenten:
quelle