2013-10-09 35 views
1

我想了解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类型的哈希全部移到前三个索引,而且它们的顺序没有改变。

回答

0

做你想要使用sort_by什么(除了如果两个元素返回相同的值,原来的顺序不保留,但它显示了如何sort_by作品)

values.sort_by! { |x| x[:type] == 1 ? 0 : 1 } 
# => [{:value=>"2222", :type=>1}, {:value=>"Second", :type=>1}, 
#  {:value=>"1111", :type=>0}, {:value=>"First", :type=>0}] 

sort_by按升序排序的元素基础上,块返回的值。

在这种情况下,它遍历所述阵列的和通过每个元件以如下块作为x

{ |x| x[:type] == 1 ? 0 : 1 } 

从上述块返回的值相互比较,并用于创建最终下令阵列。

在这种情况下,返回值为0,如果是x[:type] == 11,则返回值为0。所以x[:type] == 1的所有元素都会先订购。

查看sort_byhere

+0

你能否解释'价值返回'多一点请?究竟使用这个值是什么? – Starkers

+0

增加了一些更多的解释。 – tihom

+0

了解'| x | x [:type] == 1?'完全,以及它如何遍历数组。我知道当'x [:type] == 1时,冒号左边的值是'returned'吗?'是真实的,冒号右边的值在错误时被'返回'。但我仍然不太明白这些值是如何使用的......当你说返回的值是0时,你意味着当前散列索引在数组内被设置为0? – Starkers

0

更多信息要在这里使用sort_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}] 
0

values.sort_by {| x | x [:type]}

干杯。

0

使用#sort或#sort_by时,您不能声明项目应该移动到的索引。但是,您可以指定顺序,让#sort_by完成剩下的工作。

第一个问题是sort_by不稳定:等项可能以任意顺序排放。你需要一个稳定的排序,所以让猴子补丁可枚举有一个#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做,但如果值相等,它按物品顺序排序。这保留了相等项目的相对顺序。现在

,使用新定义的#stable_sort_by:

values.sort_by! do |h| 
    if h[:type] == 1 
    0 
    else 
    1 
    end 
end 

这移动到开始有类型的1的所有项目,但其他原因而离开项目不变的相对顺序。