假设我有一个字符串,"你好",我想生成一个字符频率图:
Map[Char,Int] = Map(h -> 1, e -> 1, o -> 1, l -> 2)
Run Code Online (Sandbox Code Playgroud)
我可以迭代地做到这一点:
val str = "hello"
var counts = new scala.collection.mutable.HashMap[Char,Int]
for (i <- str) {
if (counts.contains(i))
counts.put(i, counts(i) + 1)
else
counts.put(i, 1)
}
Run Code Online (Sandbox Code Playgroud)
通过在REPL中乱搞,我发现我可以做一些更简洁的事情而不使用可变集合:
> str.groupBy(_.toChar).map{ p => (p._1, p._2.length)}
scala.collection.immutable.Map[Char,Int] = Map(h -> 1, e -> 1, o -> 1, l -> 2)
Run Code Online (Sandbox Code Playgroud)
但是我不知道groupBy()的性能特征,也不知道传递给map的块中发生了什么(就像p确实是这样).
如何使用Scala中的功能范例以惯用方式执行此操作?
作为背景,我是第一次从Ruby来到Scala.在Ruby中,我会使用,inject但我不确定在Scala中执行它的并行方法是:
counts = str.each_byte.inject(Hash.new(0)){ |h, c| h[c] += 1; h}
Run Code Online (Sandbox Code Playgroud) 所以在另一个问题的评论中,我刚看到这个例子用于计算字符串中L'的数量:
"hello".count('l'==)
Run Code Online (Sandbox Code Playgroud)
而且很疯狂..这很有效.
从完全扩展的版本开始,我们有:
"hello".count(ch => ch == 'l')
Run Code Online (Sandbox Code Playgroud)
然后可以减少到:
"hello".count(_ == 'l')
Run Code Online (Sandbox Code Playgroud)
但是我们可以这样做:
"hello".count('l'==)
Run Code Online (Sandbox Code Playgroud)
我想要...... ??? ...
据推测,Scala推断我们必须在比较结束时添加一个_.IMO,这是事情变得非常奇怪的地方; 这对我来说似乎太过分了.任何人都可以解释允许这种语法背后的想法,或进一步阐明这一点吗?
如果您认为这很酷,那么我们如何证明不假设人们也可能想要==运算符,那么可以省略?然后我们可以:
"hello".count('l')
Run Code Online (Sandbox Code Playgroud)
我想我正在回忆到在perl中有10 ^ 99999种可能的做事方式的噩梦......