首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将For循环转换为Fold

将For循环转换为Fold
EN

Stack Overflow用户
提问于 2016-09-06 06:50:46
回答 3查看 435关注 0票数 0

我必须分析一个电子邮件语料库,看看有多少句子是由leet speak (例如lol,brb等)主导的。

对于每个句子,我执行以下操作:

代码语言:javascript
复制
   val words = sentence.split(" ")

    for (word <- words) {
      if (validWords.contains(word)) {
        score += 1
      } else if (leetWords.contains(word)) {
        score -= 1
      }
    }

有没有更好的方法使用Fold来计算分数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-06 21:37:24

如果不限于折叠,使用sum会更简洁。

代码语言:javascript
复制
sentence.split(" ")
  .iterator
  .map(word =>
    if (validWords.contains(word)) 1
    else if (leetWords.contains(word)) -1
    else 0
  ).sum
票数 1
EN

Stack Overflow用户

发布于 2016-09-06 07:48:31

没有太大的不同,但另一种选择。

代码语言:javascript
复制
val words = List("one", "two", "three")
val valid = List("one", "two")
val leet = List("three")

def check(valid: List[String], invalid: List[String])(words:List[String]): Int = words.foldLeft(0){
  case (x, word) if valid.contains(word) => x + 1
  case (x, word) if invalid.contains(word) => x - 1
  case (x, _ ) => x
}

val checkValidOrLeet = check(valid, leet)(_)
val count = checkValidOrLeet(words)
票数 3
EN

Stack Overflow用户

发布于 2016-09-06 07:00:58

这里有一种使用折叠和部分应用的方法。还可以更优雅,我会继续考虑的。

代码语言:javascript
复制
val sentence = // ...your data....
val validWords = // ... your valid words...
val leetWords = // ... your leet words...

def checkWord(goodList: List[String], badList: List[String])(c: Int, w: String): Int = {
  if (goodList.contains(w)) c + 1
  else if (badList.contains(w)) c - 1
  else c
}

val count = sentence.split(" ").foldLeft(0)(checkWord(validWords, leetWords))
print(count)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39338524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档