Scala - 如何按出现对元素进行分组?

时间:2018-05-02 22:24:58

标签: scala list scala-collections

scala 中是否有一个函数按照这些事件的数量对列表中的所有元素进行分组?

例如,我有这个清单:

val x = List("c", "b", "b", "c", "a", "d", "c")

我希望得到一个新的列表:

x = List((3, "c"), (2, "b"), (1, "a"), (1, "d"))

2 个答案:

答案 0 :(得分:3)

您可以先对每个元素count the occurrences进行反转,然后反转生成的元组:

List("c", "b", "b", "c", "a", "d", "c")
  .groupBy(identity).mapValues(_.size) // Map(b -> 2, d -> 1, a -> 1, c -> 3)
  .toList                              // List((b,2), (d,1), (a,1), (c,3))
  .map{ case (k, v) => (v, k) }        // List((2,b), (1,d), (1,a), (3,c))

您没有特别提及输出的顺序概念,但如果这是一项要求,则需要对此解决方案进行调整。

答案 1 :(得分:0)

尝试此操作,以完全按照您提到的顺序获得所需的内容。 (即,在计数时保留在列表中的订单

x.distinct.map(v=>(x.filter(_==v).size,v))

在SCALA REPL中:

scala> val x = List("c", "b", "b", "c", "a", "d", "c")
x: List[String] = List(c, b, b, c, a, d, c)

scala> x.distinct.map(v=>(x.filter(_==v).size,v))
res225: List[(Int, String)] = List((3,c), (2,b), (1,a), (1,d))

scala>