如何将列表元组展平为Scala中的列表列表

时间:2013-10-27 23:18:35

标签: list scala type-conversion tuples flatten

我是新的Scala和我正在寻找一种方法来做类似的事情

val list = List(1, 0, 1, 2, 3, 1, 2, 0, 1, 2, 0, 3, 2, 0, 1)

mylist.sortWith(_ > _).partition(_ == 1).flatten

问题是partition()产生了一个列表元组,但我需要一个列表列表。

目标是在一行中完成这项工作,而不使用其他变量,优化不是一项要求。

实现我想要做的事情的一种肮脏/愚蠢的方式是:

List(mylist.sortWith(_ > _).partition(_ == 1)._1, mylist.sortWith(_ > _).partition(_ == 1)._2).flatten

我也想知道我是否可以抛出partition()的输出来展平它

2 个答案:

答案 0 :(得分:5)

这是一种方法:

list.sorted.groupBy(_ == 1).values.toList
  • sorted()只是按升序对列表进行排序(可行,因为它只包含Ints)
  • groupBy()将此转换为true的地图 - > 1,假 - >所有其他的
  • values()返回地图的值
  • toList()将此地图值的集合转换为您想要的列表。

答案 1 :(得分:0)

这似乎是Scala的一个缺失功能​​,“将元组转换为列表的方法”,但您可以使用 productIterator 来实现...等等。 ProductIterator返回一个List [Any],所以它相当难看,但你可以这样做:

  val list = List(1, 0, 1, 2, 3, 1, 2, 0, 1, 2, 0, 3, 2, 0, 1)

  list
    .sortBy(-_)
    .partition( _ == 1 )
    .productIterator.map( _.asInstanceOf[List[Int]] )
    .toList.flatten

 // Results in: List(1, 1, 1, 1, 1, 3, 3, 2, 2, 2, 2, 0, 0, 0, 0)

只是为了展示精湛技艺,你也可以用

得到同样的答案
list.sortBy(-_).foldLeft(List[Int]()){case (a,1) => 1 +: a case (a,v) => a :+ v}

或:

list.sortBy(-_).sortWith((a,b) => a == 1)