4

我是 Scala 的新手,我正在尝试找出一些 scala 语法。

所以我有一个字符串列表。

wordList: List[String] = List("this", "is", "a", "test")

我有一个函数,它返回一个包含每个单词的辅音和元音计数的对列表:

def countFunction(words: List[String]): List[(String, Int)]

因此,例如:

countFunction(List("test")) => List(('Consonants', 3), ('Vowels', 1))

我现在想获取单词列表并按计数签名对它们进行分组:

def mapFunction(words: List[String]): Map[List[(String, Int)], List[String]]

//using wordList from above
mapFunction(wordList) => List(('Consonants', 3), ('Vowels', 1)) -> Seq("this", "test")
                         List(('Consonants', 1), ('Vowels', 1)) -> Seq("is")
                         List(('Consonants', 0), ('Vowels', 1)) -> Seq("a")

我想我需要使用 GroupBy 来做到这一点:

def mapFunction(words: List[String]): Map[List[(String, Int)], List[String]] = { 
    words.groupBy(F: (A) => K)
}

我已经阅读了 Map.GroupBy 的 scala api,看到 F 代表鉴别器函数, K 是您想要返回的键的类型。所以我尝试了这个:

    words.groupBy(countFunction => List[(String, Int)]

但是,scala 不喜欢这种语法。我尝试为 groupBy 查找一些示例,但似乎对我的用例没有任何帮助。有任何想法吗?

4

2 回答 2

7

根据您的描述,您的计数函数应该采用一个单词而不是单词列表。我会这样定义它:

def countFunction(words: String): List[(String, Int)]

如果你这样做,你应该能够调用words.groupBy(countFunction),这与:

words.groupBy(word => countFunction(word))

如果您无法更改 的签名countFunction,那么您应该可以像这样调用 group by:

words.groupBy(word => countFunction(List(word)))
于 2012-10-25T02:42:12.660 回答
0

您不应该将函数的返回类型放在调用中。编译器可以自己解决这个问题。你应该这样称呼它:

words.groupBy(countFunction)

如果这不起作用,请发布您的countFunction实施。

更新:

我在 REPL 中对其进行了测试,并且可以正常工作(请注意,我countFunction的签名与您的签名略有不同):

scala> def isVowel(c: Char) = "aeiou".contains(c)
isVowel: (c: Char)Boolean

scala> def isConsonant(c: Char) = ! isVowel(c)
isConsonant: (c: Char)Boolean

scala> def countFunction(s: String) = (('Consonants, s count isConsonant), ('Vowels, s count isVowel))
countFunction: (s: String)((Symbol, Int), (Symbol, Int))

scala> List("this", "is", "a", "test").groupBy(countFunction)
res1: scala.collection.immutable.Map[((Symbol, Int), (Symbol, Int)),List[java.lang.String]] = Map((('Consonants,0),('Vowels,1)) -> List(a), (('Consonants,1),('Vowels,1)) -> List(is), (('Consonants,3),('Vowels,1)) -> List(this, test))

可以包含传递给的函数的类型groupBy,但就像我说的那样,您不需要它。如果你想传递它,你可以这样做:

words.groupBy(countFunction: String => ((Symbol, Int), (Symbol, Int)))
于 2012-10-25T01:34:32.557 回答