Ruby 按数组排序散列

Ruby 按数组排序散列,ruby,arrays,hash,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=>

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

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}

但我不知道如何引入随机性。

您可以稍微修改一下现有内容:

h.to_a.sort_by.each_with_index{|el,i| [a[i], rand]}.to_h
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 }

您可以稍微修改您拥有的内容:

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 }

您可以稍微修改您拥有的内容:

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 }

您可以稍微修改您拥有的内容:

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 }

我没有让你的数组角色来排序散列。。。进一步解释..数组中值的递增顺序。每个(键,值)对应于数组的一个值。例如
:a=>1
对应
2
,正如
:b=>2
对应
0
。在输出散列中,“零”应排在第一位,“一”应排在第二位,等等。在回答寻求澄清的问题时(例如,@Arup),通常最好编辑您的问题(例如,“编辑:…),而不是用注释回应,因为有些读者可能不会阅读所有注释。我不会让数组的角色对哈希进行排序…解释更多关于..增加数组中值的顺序。每个(键,值)对应于数组的一个值。例如,
:a=>1
对应于
2
正如
:b=>2
对应于
0
。在输出散列中,“零”应该排在第一位,“一”排在第二位,等等。在处理寻求澄清的问题(例如@Arup)时,通常最好编辑您的问题(例如,“编辑:…”),而不是用注释回应,因为有些读者可能不会阅读所有注释。我不会让数组的角色对哈希进行排序…解释更多关于..数组中值的递增顺序。每个(键,值)对应于数组的一个值。例如,
:a=>1
对应于
2
正如
:b=>2
对应于
0
。在输出散列中,“零”应该排在第一位,“一”排在第二位,等等。在处理寻求澄清的问题(例如@Arup)时,通常最好编辑您的问题(例如,“编辑:…”),而不是用注释回应,因为有些读者可能不会阅读所有注释。我不会让数组的角色对哈希进行排序…解释更多关于..数组中值的递增顺序。每个(键,值)对应于数组的一个值。例如,
:a=>1
对应于
2
正如
:b=>2
对应于
0
。在输出散列中,“零”应该排在第一位,“一”排在第二位,等等。在处理寻求澄清的问题(例如@Arup)时,通常最好编辑您的问题(例如,“编辑:…),而不是用评论来回应,因为有些读者可能不会阅读所有的评论。我不相信你需要
来_a
@CarySwoveland你是对的。我偶然发现了它。因为我不习惯对哈希进行排序,所以我有点惊讶
sort by
返回了一个数组。为了更好地解释,我认为显式
来_a
更好e> 到_h,但不确定。虽然不是很重要。详细信息:由于
哈希#每个
返回一个两元素数组,
可枚举#排序依据
(和其他可枚举方法)作用于散列的方式与作用于两个元素数组的数组的方式相同。我不相信你需要
来_a
@CarySwoveland你是对的。我偶然发现了它。因为我不习惯对散列进行排序,所以我有点惊讶
sort by
返回了一个数组。我认为对a进行显式的
更好,来解释
对h,但不确定。虽然不是很重要。一个细节:由于
散列#每个
返回一个两元素数组,
可枚举#按
排序(和其他可枚举方法)作用于散列的方式与作用于两个元素数组的数组的方式相同。我不相信你需要
来_a
@CarySwoveland你是对的。我偶然发现了它。因为我不习惯对散列进行排序,所以我有点惊讶
sort by
返回了一个数组。我认为对a
进行显式的
更好,来解释
对h,但不确定。虽然不是很重要。一个细节:由于
散列#每个
返回一个两元素数组,
可枚举#按
排序(和其他可枚举方法)作用于散列的方式与作用于两个元素数组的数组的方式相同。我不相信你需要
来_a
@CarySwoveland你是对的。我偶然发现了它。因为我不习惯对散列进行排序,所以我有点惊讶
sort by
返回了一个数组。我认为对a
进行显式的
更好,来解释
对h
,但不确定。虽然不是很重要。一个细节:由于
散列#每个
返回一个两元素数组,
Enumerable#sort#u by
(和其他可枚举方法)对散列的作用方式与对两个元素数组的数组的作用方式相同。