2011-11-16 57 views

回答

7

由第一項的數組排序:

> a.sort_by{|x| x.last.first} 
=> [[0, {:a=>"12", :b=>"10"}], 
    [1, {:a=>"25", :b=>"19"}], 
    [0, {:a=>"31", :b=>"21"}], 
    [1, {:a=>"32", :b=>"11"}]] 

> a.sort_by{|x| x.first} 
=> [[0, {:a=>"31", :b=>"21"}], 
    [0, {:a=>"12", :b=>"10"}], 
    [1, {:a=>"32", :b=>"11"}], 
    [1, {:a=>"25", :b=>"19"}]] 

通過在散列中的第一項進行排序或者您可以通過散列的給定鍵排序:

> sort_key = :b 
> a.sort_by{|x| x.last[ sort_key ]} 
=> [[0, {:a=>"12", :b=>"10"}], 
    [1, {:a=>"32", :b=>"11"}], 
    [1, {:a=>"25", :b=>"19"}], 
    [0, {:a=>"31", :b=>"21"}]] 

如果你想是第一組值進行排序,然後通過散列中的第一項,作爲輔助搜索條件,得到的答覆是:

> a.sort_by{|x| [x.first, x.last.first]} 
=> [[0, {:a=>"12", :b=>"10"}], 
    [0, {:a=>"31", :b=>"21"}], 
    [1, {:a=>"25", :b=>"19"}], 
    [1, {:a=>"32", :b=>"11"}]] 
+2

請注意,「哈希中的第一項」僅適用於Ruby 1.9。紅寶石1.8中的哈希只有鍵,並且沒有隱式的順序。 –

+0

「或」我的意思是對其進行排序的方法: 1)由每一行的第一個元素 2)由散列中的第一個元素(本身是行中的第二個元素) P.S.我只是在解決方案中添加了評論。它有效,但我想知道是否有更好的方法。 – shabdar

+0

參見上面的解決方案.. – Tilo

1
a = [ 
    [0, {:a=>"31", :b=>"21"}], 
    [1, {:a=>"32", :b=>"11"}], 
    [1, {:a=>"25", :b=>"19"}], 
    [0, {:a=>"12", :b=>"10"}] 
] 
p a.sort_by{|el| [el.first, *el.last.values]} 

輸出:

=> [[0, {:a=>"12", :b=>"10"}], 
    [0, {:a=>"31", :b=>"21"}], 
    [1, {:a=>"25", :b=>"19"}], 
    [1, {:a=>"32", :b=>"11"}]] 
+0

這似乎根本沒有排序 – 2011-11-16 23:31:54

+0

@UnixGuy如何分類?它看起來很適合我:由第一個元素排序,然後是散列中的元素。 –

+0

@Unix guy:它按照arays的第一個元素排序(所以0在1之前);如果這些密鑰的值相同,那麼hash的a決定誰先到達,然後是key的值:b。 (增加了輸出到答案)。 – steenslag

0

好吧,我發現了一個回答我自己的問題。請比較&評論。

#sort by first item of each row (number) 
a.sort{|x,y| x[0] <=> y[0]} 

#sort by the first item in the hash 
a.sort{|x,y| x[1][:a] <=> y[1][:a]} 
相關問題