Gibt es eine Möglichkeit festzustellen, ob die Schleife zum letzten Mal iteriert? Mein Code sieht ungefähr so aus:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for(int i : array)
{
builder.append("" + i);
if(!lastiteration)
builder.append(",");
}
Jetzt möchte ich das Komma in der letzten Iteration nicht anhängen. Jetzt gibt es eine Möglichkeit festzustellen, ob es sich um die letzte Iteration handelt oder ob ich bei der for-Schleife stecke oder einen externen Zähler verwende, um den Überblick zu behalten.
java
for-loop
foreach
conditional-execution
Mercurious
quelle
quelle
Antworten:
Eine andere Alternative besteht darin, das Komma anzuhängen, bevor Sie i anhängen, nur nicht bei der ersten Iteration. (Bitte
"" + i
übrigens nicht verwenden - Sie möchten hier nicht wirklich Verkettung, und StringBuilder hat eine vollkommen gute Überladung von Anhängen (int).)Das Schöne daran ist, dass es mit jedem funktioniert
Iterable
- man kann Dinge nicht immer indizieren. (Das "Komma hinzufügen und am Ende entfernen" ist ein netter Vorschlag, wenn Sie StringBuilder wirklich verwenden - aber es funktioniert nicht für Dinge wie das Schreiben in Streams. Es ist möglicherweise der beste Ansatz für genau dieses Problem. )quelle
isFirst
boolesches Flag. Bonus: auch schneller.Ein anderer Weg, dies zu tun:
Update: Für Java 8 haben Sie jetzt Collectors
quelle
Es könnte einfacher sein, immer anzuhängen. Und wenn Sie mit Ihrer Schleife fertig sind, entfernen Sie einfach das letzte Zeichen. Tonnenweise weniger Bedingungen auch so.
Sie können
StringBuilder
'sdeleteCharAt(int index)
mit Index verwendenlength() - 1
quelle
Möglicherweise verwenden Sie das falsche Tool für den Job.
Dies ist manueller als das, was Sie tun, aber es ist in gewisser Weise eleganter, wenn nicht ein bisschen "old school"
quelle
Dies ist fast eine Wiederholung dieser StackOverflow-Frage . Was Sie wollen, ist StringUtils und das Aufrufen der Join- Methode.
quelle
Eine andere Lösung (vielleicht die effizienteste)
quelle
Explizite Schleifen funktionieren immer besser als implizite.
Sie sollten das Ganze in eine if-Anweisung einschließen, nur für den Fall, dass Sie es mit einem Array mit der Länge Null zu tun haben.
quelle
Halten Sie es einfach und verwenden Sie einen Standard für die Schleife:
oder benutze einfach apache commons-lang StringUtils.join ()
quelle
Wenn Sie es in eine klassische Indexschleife konvertieren, ja.
Oder Sie können einfach das letzte Komma löschen, nachdem es fertig ist. Wie so:
Ich benutze nur
StringUtils.join()
von commons-lang .quelle
Sie benötigen einen Klassentrenner .
Die Implementierung der Klasse
Separator
ist unkompliziert. Es umschließt eine Zeichenfolge, die bei jedem Aufruf von zurückgegeben wird, mittoString()
Ausnahme des ersten Aufrufs, der eine leere Zeichenfolge zurückgibt.quelle
Basierend auf java.util.AbstractCollection.toString () wird es vorzeitig beendet, um das Trennzeichen zu vermeiden.
Es ist effizient und elegant, aber nicht so selbstverständlich wie einige der anderen Antworten.
quelle
(! i.hasNext())
, wenn dies ein wichtiger Teil der Robustheit des Gesamtansatzes ist. (Die anderen Lösungen hier behandeln leere Sammlungen elegant, also sollten auch Ihre! :)Hier ist eine Lösung:
Suche nach der ersten Iteration :)
quelle
Wie bereits erwähnt, haben wir in Java 8 jetzt Collectors . So würde der Code aussehen:
Ich denke, das macht genau das, wonach Sie suchen, und es ist ein Muster, das Sie für viele andere Dinge verwenden könnten.
quelle
Noch eine Option.
quelle
Viele der hier beschriebenen Lösungen sind meiner Meinung nach etwas übertrieben, insbesondere diejenigen, die auf externen Bibliotheken basieren. Es gibt eine schöne, saubere und klare Sprache, um eine durch Kommas getrennte Liste zu erhalten, die ich immer verwendet habe. Es basiert auf dem bedingten (?) Operator:
Bearbeiten : Ursprüngliche Lösung korrekt, aber laut Kommentaren nicht optimal. Ein zweites Mal versuchen:
Los geht's in 4 Codezeilen, einschließlich der Deklaration des Arrays und des StringBuilder.
quelle
Hier ist ein SSCCE-Benchmark, den ich (im Zusammenhang mit dem, was ich implementieren musste) mit diesen Ergebnissen durchgeführt habe:
An meinem Beispiel zumindest ist die Prüfung bei jeder Iteration des Überspringen nicht merklich schneller speziell für vernünftige Datenmengen, aber es ist schneller.
quelle
Ein anderer Ansatz besteht darin, die Länge des Arrays (falls verfügbar) in einer separaten Variablen zu speichern (effizienter als die erneute Überprüfung der Länge jedes Mal). Sie können dann Ihren Index mit dieser Länge vergleichen, um festzustellen, ob das letzte Komma hinzugefügt werden soll oder nicht.
BEARBEITEN: Eine weitere Überlegung ist das Abwägen der Leistungskosten für das Entfernen eines endgültigen Zeichens (was zu einer Zeichenfolgenkopie führen kann) gegen das Überprüfen einer Bedingung in jeder Iteration.
quelle
Wenn Sie ein Array nur in ein durch Kommas getrenntes Array verwandeln, haben viele Sprachen genau dafür eine Verknüpfungsfunktion. Es verwandelt ein Array in eine Zeichenfolge mit einem Trennzeichen zwischen den einzelnen Elementen.
quelle
In diesem Fall müssen Sie wirklich nicht wissen, ob es sich um die letzte Wiederholung handelt. Es gibt viele Möglichkeiten, dies zu lösen. Ein Weg wäre:
quelle
Zwei alternative Wege hier:
1: Apache Commons String Utils
2: Behalten Sie einen Booleschen Wert bei
first
, der auf true gesetzt ist. Wenn in jeder Iterationfirst
falsch ist, fügen Sie Ihr Komma hinzu. danachfirst
auf false setzen.quelle
Da es sich um ein festes Array handelt, ist es einfacher, das erweiterte für ... zu vermeiden. Wenn das Objekt eine Sammlung ist, wäre ein Iterator einfacher.
quelle