Ruby:“pop”一个数组,“推”到另一个数组

时间:2015-11-10 23:10:12

标签: arrays ruby push pop

在Ruby中,我希望pop一个元素(最小的)离开一个数组,并push 相同的元素到一个新数组。我需要它是获得push的相同元素,因为我想以递归方式执行它而不会发生这种情况:

a = [1,4,2,3,5,7,8,6]
b = []
b.push(a.min) #=> b = [1]
b.push(a.min) #=> b = [1,1]
b.push(a.min) #=> b = [1,1,1]

而不是

b.push(a.min) #=> b = [1]
b.push(a.min) #=> b = [1,2]
b.push(a.min) #=> b = [1,2,3]

编辑:

应该提到,我试图不使用sort,谢谢!

4 个答案:

答案 0 :(得分:3)

问题请求递归方法。其他答案都不是递归的。

这是一个递归解决方案:

class Array
  def recursive_pop
    any? ? [delete(min)] + recursive_pop : []
  end
end

irb(main):082:0> original_array = [1,2,3]
  => [1, 2, 3]
irb(main):083:0> new_array = original_array.recursive_pop
  => [1, 2, 3]
irb(main):084:0> new_array
  => [1, 2, 3]
irb(main):085:0> original_array
  => []

根据要求,该方法逐个删除原始数组中的最小元素,并将该元素添加到新数组中。

答案 1 :(得分:1)

如果我理解正确,您可以sort初始数组,然后使用shift方法提取第一个元素。

a = [1,4,2,3,5,7,8,6].sort
b = []
b.push(a.shift) #=> b = [1]
b.push(a.shift) #=> b = [1,2]
b.push(a.shift) #=> b = [1,2,3]

答案 2 :(得分:1)

如果它是严格的数字,你正在寻找(或按字母顺序排列),你总是可以使用array.sort。

a = a.sort

成为

a = [1,2,3,4,5,6,7,8]

然后

b.push(a.shift)

答案 3 :(得分:1)

使用v.2.2 +,您可以将Enumerable#min与参数一起使用:

def pop_n_push(arr, n)
  arr.min(n).each { |e| arr.delete_at(arr.index(e)) }.to_a
end

arr = [7,8,1,4,2,3,5,2,6]
new_arr = pop_n_push(arr, 4)
  #=> [1, 2, 2, 3] 
arr
  #=> [7, 8, 4, 5, 6] 

min返回包含n arr最小元素的枚举数。这些元素中的每一个都位于arr中并从中删除。 (重复值不是问题。)Enumerator#each返回其接收器,即枚举器,然后将其转换为数组并由方法返回。可以写一下:

arr.min(n).to_a.each { |e| arr.delete_at(arr.index(e)) }

请注意,此方法会保留arr中元素的顺序。当n远远小于arr.size时,它也应该比排序数组更快。