800 Stimmen

Einfacher Weg zur Wiederholung einer Zeichenkette

Ich suche eine einfache Commons-Methode oder einen Operator, der es mir erlaubt, eine Zeichenkette zu wiederholen n Zeiten. Ich weiß, ich könnte dies mit einer for-Schleife schreiben, aber ich möchte for-Schleifen vermeiden, wann immer es nötig ist, und eine einfache direkte Methode sollte irgendwo existieren.

String str = "abc";
String repeated = str.repeat(3);

repeated.equals("abcabcabc");

Verwandt mit:

wiederholen string javascript Erstellen von NSString durch Wiederholung einer anderen Zeichenfolge eine bestimmte Anzahl von Malen

Bearbeitet

Ich versuche, for-Schleifen zu vermeiden, wenn sie nicht unbedingt notwendig sind, denn:

  1. Sie erhöhen die Anzahl der Codezeilen, auch wenn sie in einer anderen Funktion versteckt sind.

  2. Jemand, der meinen Code liest, muss herausfinden, was ich in dieser for-Schleife tue. Selbst wenn der Code kommentiert ist und aussagekräftige Variablennamen hat, muss er sich vergewissern, dass er nicht irgendetwas "Schlaues" macht.

  3. Programmierer lieben es, clevere Dinge in for-Schleifen einzubauen. Selbst wenn ich schreibe, dass die Schleife "nur das tut, was sie tun soll", schließt das nicht aus, dass jemand vorbeikommt und eine zusätzliche clevere "Lösung" einbaut.

  4. Sie sind oft sehr leicht zu verwechseln. For-Schleifen, die Indizes beinhalten, neigen dazu, Fehler zu erzeugen, die sich um einen Fehler unterscheiden.

  5. In For-Schleifen werden oft dieselben Variablen wiederverwendet, was die Wahrscheinlichkeit von schwer zu findenden Scoping-Fehlern erhöht.

  6. Denn Schleifen erhöhen die Anzahl der Stellen, an denen ein Wanzenjäger suchen muss.

48 Stimmen

Ich weiß, dass for-Schleifen einige echte Probleme verursachen können. Aber man sollte nicht versuchen, for-Schleifen "um jeden Preis" zu vermeiden, denn wenn das auf Kosten von Lesbarkeit, Wartbarkeit und Geschwindigkeit geht, ist das kontraproduktiv. Dies ist einer dieser Fälle.

2 Stimmen

Daher sollten Sie sich überlegen, ob Sie für Ihren Code nicht ausführliche Unittests durchführen wollen. So können Sie die Unit-Tests einfach anzeigen, wenn eine Dokumentation benötigt wird.

10 Stimmen

"Sie erhöhen die Anzahl der Codezeilen, auch wenn sie in einer anderen Funktion versteckt sind"... wow, einfach wow. Big-O, nicht LoC

1018voto

user102008 Punkte 29575

Hier ist die kürzeste Version (Java 1.5+ erforderlich):

repeated = new String(new char[n]).replace("\0", s);

Wo n ist die Anzahl der Wiederholungen der Zeichenkette und s ist die zu wiederholende Zeichenfolge.

Keine Importe oder Bibliotheken erforderlich.

26 Stimmen

Ich glaube nicht, dass es überhaupt verschleiert ist. Primitive Typen ( char[] (in diesem Fall) mit Nullen instanziiert werden, dann ist ein String wird aus der char[] und die Nullen sind replaced() mit dem Zeichen, das Sie in s

45 Stimmen

Dies ist zwar sehr clever (+1), aber ich denke, es beweist, dass for-Schleifen oft für klareren Code sorgen

96 Stimmen

Denjenigen, die sich über die Verschleierung beschweren, sei gesagt, dass die Lesbarkeit von der Lesefähigkeit abhängt. Es ist völlig klar, was es tut, und es ist lehrreich für diejenigen, die es vielleicht nicht sofort erkennen. Das ist es übrigens, was Sie mit Java bekommen.

578voto

Caner Punkte 53228

Wenn Sie Folgendes verwenden Java <= 7 ist dies das "prägnanteste", was es gibt:

// create a string made up of n copies of string s
String.format("%0" + n + "d", 0).replace("0", s);

Java 8 und oben gibt es eine besser lesbare Möglichkeit:

// create a string made up of n copies of string s
String.join("", Collections.nCopies(n, s));

Schließlich, für Java 11 und darüber hinaus gibt es eine neue repeat(int count) Methode speziell für diesen Zweck( lien )

"abc".repeat(12);

Wenn Ihr Projekt Java-Bibliotheken verwendet, gibt es noch weitere Möglichkeiten.

Für Apache Commons :

StringUtils.repeat("abc", 12);

Für Google Guava :

Strings.repeat("abc", 12);

5 Stimmen

Ersteres verursacht eine Ausnahme, wenn n ist Null.

0 Stimmen

Das Java 8 Beispiel lässt sich nicht kompilieren -> Type mismatch: kann nicht von List<Character> nach CharSequence konvertieren

8 Stimmen

@Arigion s muss ein String sein, nicht ein Char

408voto

Nicolai Parlog Punkte 42439

String::repeat

". ".repeat(7)  // Seven period-with-space pairs: . . . . . . . 

Neu in Java 11 ist die Methode String::repeat das genau das tut, was Sie wollten:

String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");

Seine Javadoc dice:

/**
 * Returns a string whose value is the concatenation of this
 * string repeated {@code count} times.
 * <p>
 * If this string is empty or count is zero then the empty
 * string is returned.
 *
 * @param count number of times to repeat
 *
 * @return A string composed of this string repeated
 * {@code count} times or the empty string if this
 * string is empty or count is zero
 *
 * @throws IllegalArgumentException if the {@code count} is
 * negative.
 *
 * @since 11
 */

8 Stimmen

@Nicolai Quellcode dafür, nur für den Fall, dass es jemanden interessiert hg.openjdk.java.net/jdk/jdk/file/fc16b5f193c7/src/java.base/

13 Stimmen

Ich habe nicht einmal Java gesehen 9 noch nicht auf der Straße (und wird es auch in den nächsten lang Zeit ) - und 11 wird offenbar in Kürze ausgeliefert.

5 Stimmen

Wahrscheinlich ist es offensichtlich, aber Sie können diese Methode auch für ein String-Literal aufrufen: "abc".repeat(3)

323voto

ChssPly76 Punkte 97241

Commons Lang StringUtils.repeat()

Verwendung:

String str = "abc";
String repeated = StringUtils.repeat(str, 3);

repeated.equals("abcabcabc");

105 Stimmen

Die Verwendung einer Ein-Methoden-Abhängigkeit der Einfachheit halber kann auf lange Sicht zu einer Jar-Hölle führen

84 Stimmen

Sicher, aber es ist commons lang. Ich glaube nicht, dass ich jemals ein Projekt über 5000 LOCS gesehen habe, das nicht commons lang hatte.

3 Stimmen

Die Lösung für jar-hell ist ein verwaltetes Build-Depency-System wie Maven. Importieren Sie weg.

152voto

Boann Punkte 46908

Java 8s String.join bietet eine saubere Möglichkeit, dies in Verbindung mit Collections.nCopies :

// say hello 100 times
System.out.println(String.join("", Collections.nCopies(100, "hello")));

7 Stimmen

Ich danke Ihnen! Für Android kann TextUtils.join() anstelle von String.join() verwendet werden

2 Stimmen

Ich danke Ihnen für diese Antwort. Es scheint der sauberste Weg zu sein, ohne eine externe API oder Utility-Methode zu verwenden! sehr gut!!!

2 Stimmen

Das Schöne an dieser Methode ist, dass Sie mit join ein Trennzeichen angeben können, was sich als sehr praktisch erweist, wenn Sie z. B. eine CSV-Liste erstellen wollen. Bei allen anderen Methoden haben Sie ein abschließendes Verbindungszeichen, das in einem separaten Vorgang entfernt werden muss.

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