簡體   English   中英

Ruby:如何按給定鍵的特定順序對哈希數組進行排序

[英]Ruby : How to sort an array of hash in a given order of a particular key

我有一個哈希數組, id是哈希中的鍵之一。 我想根據ID值的給定順序對數組元素進行排序。

假設我的數組(大小= 5)是:

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

我想對數組元素進行排序,使它們的id按以下順序排列:

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

因此,預期結果是:

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

這是任何自定義索引的解決方案:

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'] }

有關分類的一般說明。 使用類的#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}]

對於您的情況,要使用擴展條件進行排序,請使用#%拆分偶數和奇數索引:

[{'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}]

我將基於像這樣的值映射哈希:

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}]

為什么不只是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}]     
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'])}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM