我是新的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()的输出来展平它
答案 0 :(得分:5)
这是一种方法:
list.sorted.groupBy(_ == 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)