2015-04-04 61 views
1

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

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

...并假设我们排序从a订购,我想要的结果看起来是这样的:从Sorting

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 

所有功能似乎在序列上工作,没有任何方式指定swap操作。那么,我必须诉诸写我自己的代码进行排序吗?或者我应该实现一些自定义序列类型?如果是这样,怎么样?

+0

如果三个列表之间仍然存在一对一的对应关系,那么您可能需要将重新建模视为一个案例类实例列表? – 2015-04-06 08:45:50

回答

7

你可以用zip,sortByunzip这样做很干净。

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)元素之一。然后,我们再次对这两个序列中的第二个进行相同的操作,并得到您想要的结果。

+0

非常感谢,谢谢! – dragonroot 2015-04-04 21:49:29

相关问题