使用Scala中其中一个列表的排序对三个列表进行排序

时间:2015-04-04 21:12:35

标签: scala sorting

鉴于三个相同长度的不同列表,我想使用其中一个的排序对它们中的所有三个进行排序。例如,对于给定的三个列表:

val a = Seq(2, 1, 3)
val b = Seq("Hi", "there", "world")
val c = Seq(1.0, 2.0, 3.0)

...假设我们按a的排序排序,我希望结果如下:

aSorted: Seq[Int] = List(1, 2, 3) // Sorted by its own order
bSorted: Seq[String] = List("there", "Hi", "world") // Reordered the same way as aSorted
cSorted: Seq[Double] = List(2.0, 1.0, 3.0) // Reordered the same way as aSorted

来自Sorting的所有函数似乎都在序列上工作,而无法指定swap操作。那么我是否必须编写自己的代码进行排序?或者我应该实现一些自定义序列类型?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:7)

您可以使用zipsortByunzip非常干净地完成此任务。

val (aSorted, pair) = a.zip(b.zip(c)).sortBy(_._1).unzip
val (bSorted, cSorted) = pair.unzip

zip接受两个序列并返回一对序列(如果长度不匹配则丢弃任何额外的元素)。这意味着b.zip(c)是一系列(String, Double)元素,a.zip(b.zip(c))是一系列(Int, (String, Double))

然后我们可以使用sortBy(_._1)按照第一个序列中的元素对此序列进行排序。

最后unzip只撤消zip,将(Int, (String, Double))的序列转换为一对序列 - Int元素之一和(String, Double)元素之一。然后我们在这两个序列中的第二个上再次执行相同的操作,并且您已经获得了所需的结果。