如何计算字符串的字符?

时间:2015-04-27 12:26:49

标签: scala count character

我是Scala的新手!我想计算一个字符串中出现char的次数。我该怎么做呢?我开始写这样的东西,但我发现语法很难理解。有什么帮助吗?

 var s = "hello"
 var list = s.toList.distinct
 list.foreach(println(s.count(_=='list')))

5 个答案:

答案 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答案基本相同,只是一次性完成。