2015-07-26 8 views
34

würde Ich mag die folgende effizienter machen:Effizientes ein Zeichen/string n-mal in Scala wiederholen

def repeatChar(char:Char, n: Int) = List.fill(n)(char).mkString 
def repeatString(char:String, n: Int) = List.fill(n)(char).mkString 

repeatChar('a',3)  // res0: String = aaa 
repeatString("abc",3) // res0: String = abcabcabc 
+0

Es könnte etwas effizienter sein, wenn Sie 'Stream' anstelle von' List' verwenden –

Antwort

67

Für Strings können Sie nur "abc" * 3 schreiben, die über StringOps und benutzt hinter den Kulissen eine StringBuffer.

Für Zeichen Ich denke, Ihre Lösung ist ziemlich vernünftig, obwohl char.toString * n wohl klarer ist. Haben Sie einen Grund zu der Annahme, dass die List.fill Version nicht effizient genug für Ihre Bedürfnisse ist? Sie könnten Ihre eigene Methode schreiben, die eine StringBuffer (ähnlich * auf) verwenden würde, aber ich würde vorschlagen, zuerst für Klarheit zuerst und dann Sorgen über Effizienz nur dann, wenn Sie konkrete Beweise haben, dass das ein Problem in Ihrem Programm ist.

+3

Danke Travis. Dies war mehr aus akademischem Interesse und, wie Sie vorgeschlagen haben, um die Klarheit zu verbessern, wenn es möglich ist, und nicht um die Leistung zu verbessern. Ich wollte nur sicherstellen, dass ich die Best Practices von Anfang an aufnehme. – TimY

+0

@TimY Das ist sinnvoll - ich wünschte, mehr Menschen würden "Effizienz" in anderen Kontexten als Leistung verwenden! –

+0

Ich bin mir nicht sicher, wie vernünftig hier festgelegt wurde: Verlässt sich diese Antwort auf irgendeinen Vergleich mit anderen Optionen, wie zum Beispiel die Manipulation einfacher Java-Strings oder irgendetwas anderes, oder meinst du, dass dies der idiomatische Weg in scala ist? – matanster

0

Ich weiß, dass dies eine alte Frage ist, wäre eine andere Lösung sein, was ich unter

haben
def repeatChar(char:Char, n: Int) : String = { 
    var result = "" 
    for(_ <- 1 to n){ 
     result += "" + char 
    } 
    result 

} 

Ergebnis von REPL repeatChar ('a', 2) => res1: String = aa

Verwandte Themen