是否有一个特定的函数来检索然后删除随机数组元素?

时间:2012-06-11 22:51:59

标签: ruby

我知道我可以通过几个步骤完成此操作,但想知道是否有可以实现此功能的功能。

我想数组#sample,然后删除检索到的元素。

5 个答案:

答案 0 :(得分:25)

这个怎么样:

array.delete_at(rand(array.length))

答案 1 :(得分:12)

另一个低效的,但超级明显的是:

array.shuffle.pop

什么是好的将是Array本身的示例方法的破坏性版本,如:

class Array
  def sample!
    delete_at rand length
  end
end

答案 2 :(得分:2)

Linuxios的完美之处。这是另一个例子:

array = %w[A B C]
item_deleted = array.delete_at(1)

这里是irb:

1.9.2p0 :043 > array = %w[A B C]
 => ["A", "B", "C"] 
1.9.2p0 :044 > item_deleted = array.delete_at(1)
 => "B" 
1.9.2p0 :045 > array
 => ["A", "C"] 
1.9.2p0 :047 > item_deleted
 => "B" 

答案 3 :(得分:1)

已经提到的rand(array.length)方法的替代方法可能就是这个

element = array.delete array.sample

Eksample:

>> array   = (1..10).to_a
>> element = array.delete array.sample
>> array   # => [1, 2, 4, 5, 6, 7, 8, 9, 10]
>> element # => 3

这也是一组两个操作,但至少你不必离开阵列本身。

答案 4 :(得分:0)

如果您需要对多个项目进行采样并从原始数组中删除这些项目:

array = (1..10).to_a

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

grab = array.sample(4)

=> [2, 6, 10, 5]

grab.each{ |a| array.delete a }

=> [2, 6, 10, 5]

array
=> [1, 3, 4, 7, 8, 9]