Ruby 在散列数组中,如何编辑特定的散列';指数
我试图理解Ruby 在散列数组中,如何编辑特定的散列';指数,ruby,Ruby,我试图理解排序方法。下面是我正在试验的脚本: def test(x) if x[:type] == 1 # move the hash to the first index of the array end end values = [{value: "First", type: 0},{value: "Second", type: 1},{value: "1111", type: 0},{value: "2222", type: 1}] values.sort_by! {
排序方法。下面是我正在试验的脚本:
def test(x)
if x[:type] == 1
# move the hash to the first index of the array
end
end
values = [{value: "First", type: 0},{value: "Second", type: 1},{value: "1111", type: 0},{value: "2222", type: 1}]
values.sort_by! { |x| test(x) }
puts values
如何明确说明希望将选定索引移动到的索引?我希望类型为1的散列都移动到前三个索引,并且它们的顺序不改变 使用sort_by
执行所需操作(除非两个元素返回相同的值时不保留原始顺序,但它显示了sort_by的工作方式)
sort_by
根据块返回的值按升序对元素进行排序
在这种情况下,它迭代数组,并将每个元素作为x
{ |x| x[:type] == 1 ? 0 : 1 }
将上述块返回的值相互比较,并用于创建最终的有序数组
在这种情况下,如果x[:type]==1,则返回的值为0
,否则返回的值为1
。因此,所有x[:type]==1
的元素都将首先排序
有关sort\u by
的更多信息,请参见这里的sort\u by
。要使用sort\u by
,您需要找到保持顺序正确的方法。这里有一个,虽然有点像黑客:
values = [{value: "First", type: 0}, {value: "Second", type: 1},
{value: "1111", type: 0}, {value: "2222", type: 1}]
type = 1
n = values.size # => 4
values.each_with_index {|h,i| h[:type] = i-n if h[:type] == type}
# => [{:value=>"First", :type=>0}, {:value=>"Second", :type=>-3},
{:value=>"1111", :type=>0}, {:value=>"2222", :type=>-1}]
values.sort_by! {|h| h[:type]}
# => [{:value=>"Second", :type=>-3}, {:value=>"2222", :type=>-1},
{:value=>"1111", :type=>0}, {:value=>"First", :type=>0}]
values.map {|h| h[:type] = type if h[:type] < 0; h}
# => [{:value=>"Second", :type=>1}, {:value=>"2222", :type=>1},
{:value=>"1111", :type=>0}, {:value=>"First", :type=>0}]
values=[{value:“First”,类型:0},{value:“Second”,类型:1},
{value:“1111”,类型:0},{value:“2222”,类型:1}]
类型=1
n=值。大小#=>4
如果h[:type]==type},则每个_都具有_索引{| h,i | h[:type]=i-n
#=>[{:value=>“First”,:type=>0},{:value=>“Second”,:type=>-3},
{:value=>“1111”,:type=>0},{:value=>“2222”,:type=>-1}]
值。按排序!{| h | h[:type]}
#=>[{:value=>“Second”,:type=>-3},{:value=>“2222”,:type=>-1},
{:value=>1111,:type=>0},{:value=>First,:type=>0}]
values.map{| h | h[:type]=type如果h[:type]<0;h}
#=>[{:value=>“Second”,:type=>1},{:value=>“2222”,:type=>1},
{:value=>1111,:type=>0},{:value=>First,:type=>0}]
值。按{x{x[:type]}对u进行排序
干杯。在使用“排序”或“排序依据”时,不能声明项目应移动到的索引。但是,您可以指定顺序,并让#sort"u按顺序执行其余操作
第一个问题是sort_by不稳定:可能以任何顺序发出相同的项。您需要一个稳定的排序,因此让我们使用monkey patch Enumerable来拥有一个#stable_sort_by方法:
module Enumerable
def stable_sort_by
map.each.with_index.sort_by do |e, i|
[yield(e), i]
end.map(&:first)
end
end
这将根据块返回的值进行排序,就像#sort_by所做的那样,但如果值相等,则按项目顺序进行排序。这将保留相等项的相对顺序
现在,使用新定义的“稳定”排序方式:
values.sort_by! do |h|
if h[:type] == 1
0
else
1
end
end
这将移到所有类型为1的项目的开头,但其他项目的相对顺序保持不变。请您再解释一下“返回值”好吗?到底是什么使用了这个值?添加了更多的解释。完全理解“|x | x[:type]==1?”以及它如何在数组中迭代。我知道,当“x[:type]==1”为真时,冒号左侧的值为“返回”,当为假时,冒号右侧的值为“返回”。但是我仍然不太明白这些值是如何使用的……当你说返回的值是0时,你的意思是数组中当前哈希的索引被设置为0?我从哪里可以了解更多关于这个语法的信息,{| x | x[:type]==1?0:1},它真的很新!这个答案行不通。Rubysort
,sort\u by
不稳定。
values.sort_by! do |h|
if h[:type] == 1
0
else
1
end
end