ruby按特定顺序返回固定数量的元素

时间:2013-03-14 19:12:14

标签: ruby

这可能是一个愚蠢的问题。 我知道样本返回数组中随机数的元素。 例如, [1,2,3] .sample.times

有没有办法按特定顺序返回固定数量的元素? 我不知道如何在红宝石中做到这一点。

编辑: 让我们说我总是希望只返回第二个和最后一个数组中的penalty_name,severity和name。:

offenses = PERSON_SUMMARY[:offenses].map do |offense|
  offense[:penalties].map do |penalty|
    penalty.merge(name: offense[:offense_name])
  end
end.flatten

=> [{:penalty_name=>"Prison", :severity=>"Medium", :name=>"Speeding"}, {:penalty_name=>"Ticket", :severity=>"Low", :name=>"Speeding"}, {:penalty_name=>"Prison", :severity=>"Medium", :name=>"Shoplifting"}, {:penalty_name=>"Fine", :severity=>"Low", :name=>"Shoplifting"}]

现在我正在做:

offenses.each do |hash|
hash.sample

2 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

[1,2,3,4,5].sample(4).sort

从阵列中取出4个随机数并订购......

修改 - 发表评论后:

[5,4,3,2,1].values_at(1,-1).sort #second element(1) and last one(-1)
=>[1, 4] 

答案 1 :(得分:0)

您可以使用values_at指定所需的内容(负数从后面开始计算。)

ar=[{:penalty_name=>"Prison", :severity=>"Medium", :name=>"Speeding"}, {:penalty_name=>"Ticket", :severity=>"Low", :name=>"Speeding"}, {:penalty_name=>"Prison", :severity=>"Medium", :name=>"Shoplifting"}, {:penalty_name=>"Fine", :severity=>"Low", :name=>"Shoplifting"}]
p ar.values_at(1,-1).map{|h|h.values}
#=> [["Ticket", "Low", "Speeding"], ["Fine", "Low", "Shoplifting"]]