我想从数组中选择连续的整数,例如:
输入:(不必排序)
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]
如您所见,6
和12
缺失。
我的代码出了什么问题 - 除了bug之外 - 是否有更好的方法来编写它?
答案 0 :(得分:5)
您的代码会比较相邻元素y
和x
,但只有当它们是数组中的第一个元素(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();