相关疑难解决方法(0)

在Scala中生成字符串的频率映射

假设我有一个字符串,"你好",我想生成一个字符频率图:

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)

string scala map

27
推荐指数
4
解决办法
2万
查看次数

Scala中的参数省略/推断

所以在另一个问题的评论中,我刚看到这个例子用于计算字符串中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种可能的做事方式的噩梦......

syntax programming-languages scala

3
推荐指数
1
解决办法
266
查看次数

标签 统计

scala ×2

map ×1

programming-languages ×1

string ×1

syntax ×1