Scala - 列入计数列表和元素列表

时间:2018-01-05 20:36:05

标签: scala functional-programming

假设我有这样的Scala列表:

val mylist = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)

如何将其转换为计数列表和元素列表?例如,我想将mylist转换为:

val count = List(3,5,3,4)
val elements = List(2,4,5,6)

这意味着,在mylist中,我有3次出现2次,5次出现4次等等。

在程序中,这很简单,因为我可以制作两个空列表(用于计数和元素)并在进行迭代时填充它们。但是,我不知道如何在Scala中实现这一点。

4 个答案:

答案 0 :(得分:4)

使用.groupBy(identity)创建Map重新组合元素及其出现位置:

scala> val mylist = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)
mylist: List[Int] = List(4, 2, 5, 6, 4, 4, 2, 6, 5, 6, 6, 2, 5, 4, 4)

scala> mylist.groupBy(identity)
res0: scala.collection.immutable.Map[Int,List[Int]] = Map(2 -> List(2, 2, 2), 5 -> List(5, 5, 5), 4 -> List(4, 4, 4, 4, 4), 6 -> List(6, 6, 6, 6))

然后,您可以使用.mapValues(_.length)更改'值'地图的一部分到列表的大小:

scala> mylist.groupBy(identity).mapValues(_.length)
res1: scala.collection.immutable.Map[Int,Int] = Map(2 -> 3, 5 -> 3, 4 -> 5, 6 -> 4)

如果你想从中得到2个列表,你可以使用.unzip,它返回一个元组,第一部分是键(即元素),第二部分是值(即实例数)原始列表中的元素):

scala> val (elements, counts) = mylist.groupBy(identity).mapValues(_.length).unzip
elements: scala.collection.immutable.Iterable[Int] = List(2, 5, 4, 6)
counts: scala.collection.immutable.Iterable[Int] = List(3, 3, 5, 4)

答案 1 :(得分:4)

可以说是最短的版本:

 val elements = mylist.distinct
 val count = elements map (e => mylist.count(_ == e))

答案 2 :(得分:2)

一种方法是使用groupBy,然后检查每个"组的大小":

val withSizes = mylist.groupBy(identity).toList.map { case (v, l) => (v, l.size) }
val count = withSizes.map(_._2)
val elements = withSizes.map(_._1)

答案 3 :(得分:0)

你可以尝试这样做以及做同样的替代方法。

步骤1

阶> val mylist = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)

mylist:List [Int] = List(4,2,5,6,4,4,2,6,5,6,6,2,5,4,4)

//使用groupBy {x => x}返回" Map [Int,List [Int]]"

步骤2

阶> mylist.groupBy(x =>(x))

res0:scala.collection.immutable.Map [Int,List [Int]] = Map(2 - > List(2,2,2),5 - > List(5,5,5),4 - >列表(4,4,4,4,4),6 - >列表(6,6,6,6))

步骤3

阶> mylist.groupBy(x =>(x))。map {case(num,times)=>(num,times.size)}。toList

res1:List [(Int,Int)] = List((2,3),(5,3),(4,5),(6,4))

步骤-4 - 按数字

排序

阶> mylist.groupBy(x =>(x))。map {case(num,times)=>(num,times.size)}。toList.sortBy(_._ 1)

res2:List [(Int,Int)] = List((2,3),(4,5),(5,3),(6,4))

步骤-5 - 解压缩到列出它返回元组

阶> mylist.groupBy(x =>(x))。map {case(num,times)=>(num,times.size)}。toList.sortBy(_._ 1).unzip res3 :( List [Int],List [Int])=(List(2,4,5,6),List(3,5,3,4))