我具有類似於此的數組:如何通過Ruby中的不同元素對混合數組進行排序?
a = [
[0, {:a=>"31", :b=>"21"}],
[1, {:a=>"32", :b=>"11"}],
[1, {:a=>"25", :b=>"19"}],
[0, {:a=>"12", :b=>"10"}]
]
而且我想通過每一行的第一個元素或由散列(在該行中第二元素)的各種元件來排序。
我具有類似於此的數組:如何通過Ruby中的不同元素對混合數組進行排序?
a = [
[0, {:a=>"31", :b=>"21"}],
[1, {:a=>"32", :b=>"11"}],
[1, {:a=>"25", :b=>"19"}],
[0, {:a=>"12", :b=>"10"}]
]
而且我想通過每一行的第一個元素或由散列(在該行中第二元素)的各種元件來排序。
由第一項的數組排序:
> 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"}]]
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"}]]
這似乎根本沒有排序 – 2011-11-16 23:31:54
@UnixGuy如何分類?它看起來很適合我:由第一個元素排序,然後是散列中的元素。 –
@Unix guy:它按照arays的第一個元素排序(所以0在1之前);如果這些密鑰的值相同,那麼hash的a決定誰先到達,然後是key的值:b。 (增加了輸出到答案)。 – steenslag
好吧,我發現了一個回答我自己的問題。請比較&評論。
#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]}
請注意,「哈希中的第一項」僅適用於Ruby 1.9。紅寶石1.8中的哈希只有鍵,並且沒有隱式的順序。 –
「或」我的意思是對其進行排序的方法: 1)由每一行的第一個元素 2)由散列中的第一個元素(本身是行中的第二個元素) P.S.我只是在解決方案中添加了評論。它有效,但我想知道是否有更好的方法。 – shabdar
參見上面的解決方案.. – Tilo