鉴于三个相同长度的不同列表,我想使用其中一个的排序对它们中的所有三个进行排序。例如,对于给定的三个列表:
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
操作。那么我是否必须编写自己的代码进行排序?或者我应该实现一些自定义序列类型?如果是这样,怎么样?
答案 0 :(得分:7)
您可以使用zip
,sortBy
和unzip
非常干净地完成此任务。
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)
元素之一。然后我们在这两个序列中的第二个上再次执行相同的操作,并且您已经获得了所需的结果。