按数组排序哈希

时间:2015-04-05 14:09:40

标签: ruby arrays hash

我有一个哈希和一个长度相同的数组,如下所示:

h = {:a => 1, :b => 2, :c => 3, :d => 4}
a = [2, 0, 1, 0]

我想按照数组中值的递增顺序对哈希进行排序。所以输出将是这样的:

h = {:b => 2, :d => 4, :c=> 3, :a => 1}

理想情况下,我想为关系引入一些随机性。对于前面的示例,我想要先前的输出或:

h = {:d => 4, :b => 2, :c=> 3, :a => 1}

这就是我尝试过的。

b = a.zip(h).sort.map(&:last)
p Hash[b]
# => {:b=>2, :d=>4, :c=>3, :a=>1}

但我不确定如何引入随机性。

2 个答案:

答案 0 :(得分:2)

h.to_a.sort_by.each_with_index{|el,i| [a[i], rand]}.to_h

答案 1 :(得分:1)

您可以稍微修改一下:

def doit(h,a)
   Hash[a.zip(h).sort_by { |e,_| [e,rand] }.map(&:last)]
end

doit(h,a) #=> { b=>2, d=>4, c=>3, a=>1 }
doit(h,a) #=> { d=>4, b=>2, c=>3, a=>1 }
doit(h,a) #=> { b=>2, d=>4, c=>3, a=>1 }
doit(h,a) #=> { b=>2, d=>4, c=>3, a=>1 }