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

dra*_*oot 1 sorting scala

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

val a = Seq(2, 1, 3)
val b = Seq("Hi", "there", "world")
val c = Seq(1.0, 2.0, 3.0)
Run Code Online (Sandbox Code Playgroud)

...并假设我们按顺序排序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
Run Code Online (Sandbox Code Playgroud)

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

Tra*_*own 7

你可以用,和zip,干净利落地做到这一点.sortByunzip

val (aSorted, pair) = a.zip(b.zip(c)).sortBy(_._1).unzip
val (bSorted, cSorted) = pair.unzip
Run Code Online (Sandbox Code Playgroud)

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

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

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