Scala 如何不使用foldLeft将空间计为字符
我有一个练习,我必须检查一个字符串中使用了多少不同的字符。 我不知道怎样才能不把空间算作字符。我想把if放在折页里,比如:Scala 如何不使用foldLeft将空间计为字符,scala,functional-programming,Scala,Functional Programming,我有一个练习,我必须检查一个字符串中使用了多少不同的字符。 我不知道怎样才能不把空间算作字符。我想把if放在折页里,比如: str.foldLeft(lista)((acc, char) => if (char != ' ') char :: acc) 但后来它说需要的列表[Char],找到了:Any。 你通常对我的功能有什么看法?我能做得更快/更有效吗 def countChars(str: String): Int = { val lista = List[Char]()
str.foldLeft(lista)((acc, char) => if (char != ' ') char :: acc)
但后来它说需要的列表[Char],找到了:Any。
你通常对我的功能有什么看法?我能做得更快/更有效吗
def countChars(str: String): Int = {
val lista = List[Char]()
val letters = str.foldLeft(lista)((acc, char) => char :: acc)
val result = letters.toSet.size
return result
}
println(countChars("hello world"))
首先,您可以从一开始就使用
Set
作为累加器。然后,如果不应计算当前字符数,则可以使用if-else并返回当前累加器:
val set = Set[Char]()
val uniqueCount = str.foldLeft(set)((acc, char) => if (char != ' ') acc + char else acc)
.size
我不确定这是否“更快或更有效”,也许有一点,但肯定读起来更好,更地道:)
或者
str.iterator.distinct.count(!_.isWhitespace)
如果设置为使用foldLeft
,则与先创建列表,然后将其转换为set相比,折叠到set
将节省一些时间:
str.foldLeft(Set.empty[Char]) {
case (s, ' ') => s
case (s, c) => s + c
}.size
或者,您可以在之后清除空间:
(str.foldLeft(Set.empty[Char])(_ + _) - ' ').size
您可以使用模式匹配。那么您就不需要
if…else
def countChars(str: String): Int =
str.foldLeft(Set[Char]()){
case (acc, ' ') => acc
case (acc, c) => acc + c
}.size
非常感谢。我很接近,但我只是不知道该写什么:)我有一个问题:我不知道什么时候使用:+,:,+。我看到你在用“+”。有什么区别?我什么时候可以使用我提到的选项?@squall很乐意帮忙!如果答案对您有效,请将其标记为已接受(答案左侧的勾选框)@squall它取决于您正在使用的集合和您要执行的操作=)
def countChars(str: String): Int =
str.foldLeft(Set[Char]()){
case (acc, ' ') => acc
case (acc, c) => acc + c
}.size