2015-07-26 19 views
34

vorrei effettuare le seguenti operazioni in modo più efficiente:efficiente ripetere un carattere/stringa di n volte a Scala

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

E ' potrebbe essere leggermente più efficiente se si utilizza 'Stream' invece di' List' –

risposta

67

Per le stringhe si può semplicemente scrivere "abc" * 3, che funziona tramite StringOps e utilizza un StringBuffer dietro le quinte.

Per i caratteri, penso che la soluzione sia abbastanza ragionevole, anche se lo char.toString * n è decisamente più chiaro. Avete qualche motivo di sospettare che la versione List.fill non sia abbastanza efficiente per le vostre esigenze? Potresti scrivere il tuo metodo che userebbe un StringBuffer (simile a * su StringOps), ma ti suggerirei di puntare prima alla chiarezza e poi preoccuparti dell'efficienza solo quando hai prove concrete che questo è un problema nel tuo programma.

+3

Grazie a Travis. Questo era più per interesse accademico e, come lei suggeriva, per migliorare la chiarezza se possibile, piuttosto che per migliorare le prestazioni. Volevo solo assicurarmi di raccogliere le migliori pratiche dall'inizio. – TimY

+0

@TimY Questo ha senso: vorrei che più persone usassero "efficienza" in contesti diversi dalle prestazioni! –

+0

Non sai come sia stato determinato ragionevole in questo caso: questa risposta si basa su qualsiasi benchmark rispetto ad altre opzioni, come la manipolazione di semplici stringhe Java o qualcos'altro, o preferisci dire che questo è il modo idiomatico in scala? – matanster

0

So che questa è una vecchia questione, un'altra soluzione potrebbe essere quello che ho qui di seguito

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

} 

risultato da REPL repeatChar ('a', 2) => res1: String = aa

Problemi correlati