Scala - 如何按出现次数对元素进行分组?
Scala - How to group elements by occurrence?
scala 中是否有一个函数可以根据出现的次数对列表的所有元素进行分组?
例如,我有这个列表:
val x = List("c", "b", "b", "c", "a", "d", "c")
我想要一个这样的新列表:
x = List((3, "c"), (2, "b"), (1, "a"), (1, "d"))
您可以先 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))
您没有特别提到输出顺序的概念,但如果这是一个要求,则需要调整此解决方案。
试试这个,按照你提到的顺序得到你想要的。 (即,在进行计数时在列表中保留的顺序):
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>
scala 中是否有一个函数可以根据出现的次数对列表的所有元素进行分组?
例如,我有这个列表:
val x = List("c", "b", "b", "c", "a", "d", "c")
我想要一个这样的新列表:
x = List((3, "c"), (2, "b"), (1, "a"), (1, "d"))
您可以先 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))
您没有特别提到输出顺序的概念,但如果这是一个要求,则需要调整此解决方案。
试试这个,按照你提到的顺序得到你想要的。 (即,在进行计数时在列表中保留的顺序):
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>