在Scala中高效地重复一个字符/字符串n次

65

我希望能更高效地完成以下任务:

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

如果你使用Stream而不是List,可能会稍微更有效率一些。 - Sascha Kolberg
2个回答

131

对于字符串,您可以直接编写"abc" * 3,这将通过StringOps实现,并在幕后使用StringBuffer

对于字符,我认为您的解决方案相当合理,尽管char.toString * n可能更清晰。您有任何理由怀疑List.fill版本不足以满足您的需求吗?您可以编写自己的方法,该方法将使用StringBuffer(类似于StringOps上的*),但我建议首先以清晰为目标,然后只有在具体证据表明这是您程序中的问题时才担心效率。


3
谢谢Travis。我之所以提出这个问题,更多是出于学术兴趣,并且如你所建议的,如果可能的话改善清晰度,而不是为了提高性能。我只是想确保我从一开始就掌握最佳实践。 - TimY
@TimY 这很有道理——我希望更多的人在除了性能之外的其他情境中使用“效率”这个词! - Travis Brown
不确定这里的合理性是如何确定的:这个答案是否依赖于与其他选项(例如操作普通的Java字符串或其他任何东西)进行比较的基准,还是您指的是这是Scala中惯用的方式? - matanster
@TravisBrown 如果n是Long类型,这个解决方案还能行吗? - Moustafa Mahmoud
2
@MoustafaMahmoud 为什么不试一下呢? - Travis Brown
1
你总是可以在一个 Long 上调用 toInt 方法(如果 Long 太大会溢出,但在这种情况下似乎不太可能有意义)。 - Travis Brown

0

你可以简单地定义:

def repeatChar(char:Char, n: Int) = char.toString() * n
def repeatString(char:String, n: Int) = char * n

1
".repeat(n)" 不是 String 的一个方法。 - Manabu Tokunaga
我的错。我在使用Scala编写Gatling模拟测试Java应用程序时,也包含了java.lang包。我没有意识到我正在使用java.lang.String来进行repeat方法。 - Pallav
2
这与6年前被接受的答案在任何有意义的方面有何不同? - jwvh
好了,投票提高了。 - Manabu Tokunaga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接