Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在散列数组中,如何编辑特定的散列';指数_Ruby - Fatal编程技术网

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},它真的很新!这个答案行不通。Ruby
sort
sort\u by
不稳定。
values.sort_by! do |h|
  if h[:type] == 1
    0
  else
    1
  end
end