2014-02-10 21 views
1

我有一個散列數組,id是散列中的鍵之一。我想根據ID值的給定順序對數組元素進行排序。Ruby:如何按特定鍵的給定順序對散列數組進行排序

假設我的陣列(大小= 5):

[{"id"=>1. ...}, {"id"=>4. ...}, {"id"=>9. ...}, {"id"=>2. ...}, {"id"=>7. ...}] 

我想使得它們id s爲以下順序數組元素進行排序:

[1,3,5,7,9,2,4,6,8,10] 

所以預期的結果是:

[{'id' => 1},{'id' => 7},{'id' => 9},{'id' => 2},{'id' => 4}] 

回答

3

這裏是一個解決方案任何自定義指數:

def my_index x 
    # Custom code can be added here to handle items not in the index. 
    # Currently an error will be raised if item is not part of the index. 
    [1,3,5,7,9,2,4,6,8,10].index(x) 
end 

my_collection = [{"id"=>1}, {"id"=>4}, {"id"=>9}, {"id"=>2}, {"id"=>7}] 
p my_collection.sort_by{|x| my_index x['id'] } #=> [{"id"=>1}, {"id"=>7}, {"id"=>9}, {"id"=>2}, {"id"=>4}] 

然後你就可以在任何你想要的方式格式化,也許這是漂亮:

my_index = [1,3,5,7,9,2,4,6,8,10] 
my_collection.sort_by{|x| my_index.index x['id'] } 
1

有關排序的一般說明。使用類的#sort_by方法:

[{'id' => 1},{'id'=>3},{'id'=>2}].sort_by {|x|x['id'] } 
# => [{"id"=>1}, {"id"=>2}, {"id"=>3}] 

或者與使用#values方法作爲回調:

[{'id' => 1},{'id'=>3},{'id'=>2}].sort_by(&:values) 
# => [{"id"=>1}, {"id"=>2}, {"id"=>3}] 

,或者你可以用#sort方法使用更明顯的版本:

[{'id' => 1},{'id'=>3},{'id'=>2}].sort {|x,y| x['id'] <=> y['id'] } 
# => [{"id"=>1}, {"id"=>2}, {"id"=>3}] 

爲了您的情況,要使用擴展條件排序使用#%來分割ev烯和奇數索引:

[{'id' => 1},{'id'=>4},{'id'=>9},{'id'=>2},{'id'=>7}].sort do |x,y| 
    u = y['id'] % 2 <=> x['id'] % 2 
    u == 0 && y['id'] <=> x['id'] || u 
end 
# => [{"id"=>1}, {"id"=>7}, {"id"=>9}, {"id"=>2}, {"id"=>4}] 

對於你的情況下,具有擴展狀態進行排序使用#%根據索引分裂,甚至id值是索引陣列中不存在:

index = [1,3,5,7,4,2,6,8,10] # swapped 2 and 4, 9 is absent 

[{'id' => 1},{'id'=>4},{'id'=>9},{'id'=>2},{'id'=>7}].sort do |x,y| 
    !index.rindex(x[ 'id' ]) && 1 || index.rindex(x[ 'id' ]) <=> index.rindex(y[ 'id' ]) || -1 
end 
# => [{"id"=>1}, {"id"=>7}, {"id"=>4}, {"id"=>2}, {"id"=>9}] 
+0

@僧碼感謝名單=) –

+0

預期結果是'[{的 'id'=> 1},{ 'ID'=> 7},{ 'ID'=> 9},{ 'id'=> 2},{'id'=> 4}]' – nish

+0

@Малъ我喜歡乾淨的解決方案。 –

1

我會映射基礎上像這樣的價值觀哈希:

a = [{"id"=>1}, {"id"=>4}, {"id"=>9}, {"id"=>2}, {"id"=>7}] 

[1,3,5,7,9,2,4,6,8,10].map{|x| a[a.index({"id" => x})] }.compact 

#=> [{"id"=>1}, {"id"=>7}, {"id"=>9}, {"id"=>2}, {"id"=>4}] 
0

爲什麼不sort

def doit(arr, order) 
    arr.sort { |h1,h2| order.index(h1['id']) <=> order.index(h2['id']) } 
end 

order = [1,3,5,7,9,2,4,6,8,10] 
arr = [{'id' => 1}, {'id' => 4}, {'id' => 9}, {'id' => 2}, {'id' => 7}]  

doit(arr, order) 
    #=> [{'id' => 1}, {'id' => 7}, {'id' => 9}, {'id' => 2}, {'id' => 4}]  
0
a= [{"id"=>1}, {"id"=>4}, {"id"=>9}, {"id"=>2}, {"id"=>7}] 
b=[1,3,5,7,9,2,4,6,8,10] 
a.sort_by{|x| b.index (x['id'])} 
相關問題