从Ruby中的数组中选择连续的整数

时间:2016-01-14 09:19:30

标签: arrays ruby

我想从数组中选择连续的整数,例如:

输入:(不必排序)

array = [1, 3, 6, 7, 8, 9, 10, 12, 13, 17]

预期产出:

#=> [6, 7, 8, 9, 10, 12, 13]

到目前为止,这是我的代码:

array = [1, 3, 9, 6, 7, 10, 8, 12, 13, 17]
newarray = []
z = 0
array.sort.each_cons(2) do |x, y|
  if y == x + 1
    if z == 0
      newarray.insert(0, x, y)
    else
      newarray.push(y)
    end
  end
  z = z + 1
end

newarray #=> [7, 8, 9, 10, 13]

如您所见,612缺失。

我的代码出了什么问题 - 除了bug之外 - 是否有更好的方法来编写它?

1 个答案:

答案 0 :(得分:5)

您的代码会比较相邻元素yx,但只有当它们是数组中的第一个元素(y)时才会推送if z == 0; newarray.insert(0, x, y)y 。否则,仅推送 x y y == x+1 -------------------- 1 3 false 3 6 false 6 7 true #=> push(7) 7 8 true #=> push(8) 8 9 true #=> push(9) 9 10 true #=> push(10) 10 12 false 12 13 true #=> push(13) 13 17 false ,因此缺少每组连续整数的第一个元素。

此表说明了正在发生的事情:

z

您可以使用z = true array.sort.each_cons(2) do |x, y| if y == x + 1 if z newarray.push(x, y) z = false else newarray.push(y) end else z = true end end 作为群组开头的指标来修复您的代码:

array = [1, 3, 9, 6, 7, 10, 8, 12, 13, 17]

array
  .sort                              #=> [1, 3, 6, 7, 8, 9, 10, 12, 13, 17]
  .chunk_while { |x, y| y == x + 1 } #=> [[1], [3], [6, 7, 8, 9, 10], [12, 13], [17]]
  .select { |a| a.size > 1 }         #=> [[6, 7, 8, 9, 10], [12, 13]]
  .flatten                           #=> [6, 7, 8, 9, 10, 12, 13]

更好的方法是使用Ruby 2.3中引入的chunk_while

a = [1,2,4,9,10,11,12,15,16,19,20,21]
b = a.chunk_while {|i, j| i+1 == j }
p b.to_a #=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]

您是否注意到该文档包含类似的示例?

  

例如,逐个增加的子序列可以按如下方式分块:

$category = Mage::getModel('catalog/category')->load($cat_id);
  $productCollection = $category->getProductCollection();