我是Scala的新手!我想计算一个字符串中出现char的次数。我该怎么做呢?我开始写这样的东西,但我发现语法很难理解。有什么帮助吗?
var s = "hello"
var list = s.toList.distinct
list.foreach(println(s.count(_=='list')))
答案 0 :(得分:10)
如果你想要一个关于计数的字符地图,你可以尝试这样的事情:
val str = "hello"
val countsMap:Map[Char,Int] =
str.
groupBy(identity).
mapValues(_.size)
哪个会扩展为更长的形式:
str.
groupBy(c => c).
mapValues(str => str.size)
所以为了解决这个问题,在groupBy
我们说我们想要按字符串中的各个Char
进行分组。这将产生Map[Char, String]
,如此:
Map(e -> e, h -> h, l -> ll, o -> o)
然后,您使用Map
方法重新映射mapValues
的值部分,告诉它使用.size
的{{1}}而不是{{1}本身。
答案 1 :(得分:4)
试试这个:
小费,不要使用vars。
val l = "hello"
scala> l.distinct.toCharArray.map(x=>(x,l.count(_==x)))
res1: Array[(Char, Int)] = Array((h,1), (e,1), (l,2), (o,1))
它返回一个(Char, Int)
地图数组,其中包含字符及其相关计数。
答案 2 :(得分:2)
你很亲密:
val s = "hello"
val list = s.toList.distinct
list.foreach(c => println(s.count(_ == c)))
我已将var
更改为val
s,因为它们没有理由成为var
。
请注意,将String
转换为List
并不是真的有任何理由。如果你不这样做,它仍然有效:
val s = "hello"
s.distinct.foreach(c => println(s.count(_ == c)))
答案 3 :(得分:1)
您可以使用groupBy
轻松对字符进行分组,然后测量长度:
scala> "hello".toList.groupBy(identity)
res0: scala.collection.immutable.Map[Char,List[Char]] = Map(e -> List(e), h -> List(h), l -> List(l, l), o -> List(o))
scala> res0.map { case (char, list) => (char, list.length) }
res1: scala.collection.immutable.Map[Char,Int] = Map(e -> 1, h -> 1, l -> 2, o -> 1)
答案 4 :(得分:1)
或者,作为“有多种方法可以做到这一点”的说明
var s = "hello"
s.foldLeft(Map[Char, Int]() withDefaultValue 0)
{(acc, c) => acc updated (c, acc(c)+1)}
//> res0: scala.collection.immutable.Map[Char,Int] =
Map(h -> 1, e -> 1, l -> 2, o -> 1)
并使用Scala的更多功能。这与groupBy / mapValues答案基本相同,只是一次性完成。