代码之家  ›  专栏  ›  技术社区  ›  user_che_ban

Scala-计算字符串中的特定字符数(以函数样式)

  •  0
  • user_che_ban  · 技术社区  · 6 年前

    我可以用下面的代码计算特定的字符串

     var count = 0
    for (i <- "HelloWorldHHHH") {
    if (i == 'H') {
      count = count + 1
    }
    println(count)
    

    或者使用内置的

    "HelloWorldHHHH".count(_ == 'H')
    

    有人能帮我用纯函数的方式编写相同的功能吗

    我尝试了下面的方法,但不确定哪里出了问题

    val count1 = "Hello".foldLeft(0)((x,_) match { case k if(k == 'h') => x +1})
    

    最后的代码有一些错误,有人能帮我修复错误或给出正确的解决方案吗

    3 回复  |  直到 6 年前
        1
  •  3
  •   dvir    6 年前

    "HelloWorldHHHH".count(_ == 'H') 已经是纯功能风格,而且它似乎是我的首选,因为它非常简短且可读。

    更多选项:

    折叠 :

    "HelloWorldHHHH".foldLeft(0){case(count, char) => if (char == 'H') count + 1 else count }
    

    a后求和以便于理解 .请注意,您可以使用防护装置(如果):

    val hs = for {
      i <- "HelloWorldHHHH"
      if i == 'H'
    } yield 1
    hs.sum
    

    正在收集 :

    "HelloWorldHHHH".collect{ case 'H' => 1 }.sum
    
        2
  •  2
  •   Gabriele Petronella    6 年前

    如果您真的想在生产代码中这样做,我建议使用stdlib count 方法:

    "HelloWorldHHHH".count(_ == 'H')
    

    出于学习目的,您可以自己动手 foldLeft :

    "HelloWorldHHHH".foldLeft(0) { case (sum, char) =>
      if (char == 'H') sum + 1 else sum
    }
    
        3
  •  1
  •   Saskia    6 年前

    您可以删除if,只需在case块中插入您的角色

    "Hello".foldLeft(0) {(acc,c) => c match {
        case 'l' => acc + 1
        case _ => acc
      }
    }