计算列表中的所有元素是Haskell中的一个单行:
count xs = toList (fromListWith (+) [(x, 1) | x <- xs])
Run Code Online (Sandbox Code Playgroud)
以下是一个示例用法:
*Main> count "haskell scala"
[(' ',1),('a',3),('c',1),('e',1),('h',1),('k',1),('l',3),('s',2)]
Run Code Online (Sandbox Code Playgroud)
这个函数在Scala中也可以如此优雅地表达吗?
假设你有
val docs = List(List("one", "two"), List("two", "three"))
Run Code Online (Sandbox Code Playgroud)
例如List("one","two")表示包含术语"one"和"two"的文档,并且您希望为每个术语构建一个包含文档频率的地图,即在这种情况下
Map("one" -> 1, "two" -> 2, "three" -> 1)
Run Code Online (Sandbox Code Playgroud)
你会如何在Scala中做到这一点?(并且以有效的方式,假设一个更大的数据集.)
我的第一个类似Java的想法是使用一个可变映射:
val freqs = mutable.Map.empty[String,Int]
for (doc <- docs)
for (term <- doc)
freqs(term) = freqs.getOrElse(term, 0) + 1
Run Code Online (Sandbox Code Playgroud)
它运作得很好,但我想知道如何以更"功能"的方式做到这一点,而不是诉诸一个可变的地图?
这一行:var counter : Integer = jm.get(ls)在下面的代码中,当它应为null时,返回值为0的Integer.这是为什么会发生的?
根据文档,如果找不到元素,则HashMap的get方法返回null.下面的代码是计算列表中元素的数量
import scala.collection.JavaConversions._
object Tester {
def main(args: Array[String]) {
var listOfLinks : java.util.Set[String] = new java.util.TreeSet[String]
listOfLinks.add("1")
listOfLinks.add("1")
listOfLinks.add("1")
listOfLinks.add("2")
listOfLinks.add("3")
listOfLinks.add("3")
listOfLinks.add("3")
listOfLinks.add("3")
var l: java.util.List[String] = new java.util.ArrayList[String]
var jm: java.util.Map[String, Int] = new java.util.HashMap[String, Int];
for (ls <- listOfLinks) {
var counter : Integer = jm.get(ls)
if (counter == null) {
jm.put(ls, 1)
} else {
counter = counter + 1
jm.put(ls, counter)
}
}
for(jmv <- jm){ …Run Code Online (Sandbox Code Playgroud) 我是Scala的新手.
如果我有以下内容List:
val ls = List("a", "a", "a", "b", "b", "c")
Run Code Online (Sandbox Code Playgroud)
如何创建一个Map包含列表中每个元素的多个外观?
例如,Map上面的列表应该是:
Map("a" -> 3, "b" -> 2, "c" -> 1)
Run Code Online (Sandbox Code Playgroud) 我有一个RDD [(Int,ListBuffer [Byte])],我喜欢对列表中的每个数字执行“字数统计”。例如,RDD为:
(31000,ListBuffer(1, 1, 0, 1, 0, 1, 1, 1, 1))
(21010,ListBuffer(0, 0, 0))
(23000,ListBuffer(1, 1, 1, 1, 1))
(01000,ListBuffer(1, 1))
(34000,ListBuffer(0))
Run Code Online (Sandbox Code Playgroud)
我想得到这个:
(31000,(0,2),(1,7)) // this could be a Map[0=>2, 1=>7]
(21010,(0,3))
(23000,(1,5))
(01000,(1,2))
(34000,(0,3))
Run Code Online (Sandbox Code Playgroud)
有指导吗?先感谢您
编辑:有人建议重复我的问题,但建议的帖子只涉及一个列表,但我想申请一个结对(整数,列表)。