2

我是 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() 的输出转换为展平它

4

2 回答 2

5

这是一种方法:

list.sorted.groupBy(_ == 1).values.toList
  • sorted() 只是按升序对列表进行排序(可行,因为它只包含 Ints)
  • groupBy() 将其转换为 true -> 1's, false -> all else 的映射
  • values() 返回地图的值
  • toList() 将此地图值的集合转换为您想要的列表。
于 2013-10-27T23:56:45.453 回答
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)    
于 2013-10-28T10:47:06.730 回答