Scala 如何不使用foldLeft将空间计为字符

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]()

我有一个练习,我必须检查一个字符串中使用了多少不同的字符。 我不知道怎样才能不把空间算作字符。我想把if放在折页里,比如:

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