2011-12-27 84 views
1

我有兩個數組:如何以相同的方式對兩個數組進行排序?

a = [6, 4, 3] 
b = [1, 3, 4] 

我打電話a.sort

a.sort = [3, 4, 6] 

我怎麼排序陣列b所以值具有排序之前相同的位置值陣列a

這將是現在:

b = [4, 3, 1] 

因此,在b值在陣列a同一位置值。

+0

什麼是您的排序方法?你寫的東西,還是你使用的圖書館? – Didaxis 2011-12-27 19:40:22

+0

我只是在我的Rails控制檯中調用.sort認爲它使用Comparable – 2011-12-27 19:41:31

+0

您希望'b'在排序前具有與'a'相同的排序邏輯嗎? – 2011-12-27 19:51:18

回答

12

你可以使用zip方法既陣列組合成一個。一旦你把A和B,你會得到,

[[6, 1], [4, 3], [3, 4]] 

現在陣列,這將根據導致每個子陣列的第一個元素進行排序分類,

[[3, 4], [4, 3], [6, 1]] 

現在,我們希望做zip的反轉以獲得每個子數組的第一個和第二個元素到一個新的數組中。使用transpose,我們可以得到它放回原來的形式,

[[3, 4, 6], [4, 3, 1]] 

值得慶幸的是使用並行分配這一切都是可能的一條線。下面是完整的代碼,

x, y = a.zip(b).sort.transpose 

現在x應該包含[3, 4, 6]y應該包含[4, 3, 1]

+2

不錯!很好的使用#zip。 – DigitalRoss 2011-12-27 19:57:27

+0

剛剛使用了a,b而不是x,y – 2011-12-27 20:05:03

0

我不知道你在努力達到什麼目的,我相信其他人可以想出一個更優雅的解決方案,但我會使用哈希代替。將a的值指定爲鍵值,將b的值指定爲值。您可以迭代一次來完成此操作,或者在創建此數據時提前完成。結果應該是:

$ hash 
=> {6 => 1, 4 => 3, 3 => 4} 
    a0 b0 a1 b1 a2 b2 
$ hash.sort 
=> [[3, 4], [4, 3], [6, 1]] 

就像我說的,不是超光滑,但我有火雞解酒...

0
[a, b].transpose.sort { |x, y| x[0] <=> y[0] }.transpose[1] 
=> [4, 3, 1] 

a, b = [a, b].transpose.sort { |x, y| x[0] <=> y[0] }.transpose 
+0

您應該總是使用'sort_by'來進行鍵控排序。它不僅更具可讀性,而且更高效。 – 2011-12-28 01:18:42

2
a = [6, 4, 3] 
b = [1, 3, 4] 

ra, rb = a.zip(b).sort_by(&:first).transpose 
# ra => [3, 4, 6] 
# rb => [4, 3, 1] 
相關問題