2015-04-04 60 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

相關問題