Ruby 按连续序列拆分数组

Ruby 按连续序列拆分数组,ruby,sorting,sequences,Ruby,Sorting,Sequences,给定一个整数数组,例如: array = [1,2,3,5,6,7,20,21,33,87,88,89,101] 此数组包含k连续子序列(在本例中k=6),例如“1,2,3”和“87,88,89”。如何获取包含这些k子序列的数组 对于上述示例,这些将是: [[1,2,3], [5,6,7], [20,21], [33], [87,88,89], [101]] 编辑: 如果您使用的是rails,那么有一种简单的方法,即使用主动支持方法 还是红宝石 def sort_it(arr) tmp,

给定一个整数数组,例如:

array = [1,2,3,5,6,7,20,21,33,87,88,89,101]
此数组包含
k
连续子序列(在本例中
k=6
),例如“1,2,3”和“87,88,89”。如何获取包含这些
k
子序列的数组

对于上述示例,这些将是:

[[1,2,3], [5,6,7], [20,21], [33], [87,88,89], [101]]
编辑:

如果您使用的是rails,那么有一种简单的方法,即使用主动支持方法

还是红宝石

def sort_it(arr)
  tmp, main = [], []
  arr.each_with_index do |x, i|
    if arr[i-1]
      if arr[i-1] + 1 == x
        tmp << x
      else
        main << tmp unless tmp.empty?
        tmp = [x]
      end
    else
      tmp << x
    end
  end
  main << tmp
  main
end


> a = [1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 27]
> sort_it(a)
=> [[1], [3], [5, 6], [8, 9], [11, 12, 13, 14], [16], [27]]
def排序(arr)
tmp,main=[],[]
arr.每个_与_索引do | x,i|
如果arr[i-1]
如果arr[i-1]+1==x
tmp
def seq_排序(数组)
finished=[array.first],i=0
数组。每个_cons(2)do |(a,b)|
如果b-a==1
已完成[i]序列排序([1,2,38,39,92,941031041051002])
=> [[1,2], [38, 39], [92], [94], [103, 104, 105], [1002]]

未移动的
0
是一个虚拟对象。可以是任何号码

[1, 2, 3, 5, 6, 7]
.unshift(0)
.each_cons(2).slice_before{|m, n| m + 1 < n}.map{|a| a.map(&:last)}
# => [[1, 2, 3], [5, 6, 7]]
[1,2,3,5,6,7]
.unshift(0)
在{m,n{m+1 [[1, 2, 3], [5, 6, 7]]

不明白!你能澄清这个问题吗?更新了这个例子使它更清楚(希望如此)谢谢!必须将i'finished=[[array.first]],i=0'更改为'finished=[array.first],i=0'才能获得预期的输出。我给你答案是因为你的答案是第一个,而且也更接近于我可能会回答的答案……如果我回答了:-)我一定是在测试中忽略了这一点!您应该更新您的问题,以便更清楚地说明您想要什么。:-)最好将
finished=[[array.first]],i=0
分散到不同的行中。否则,您将得到
seq_sort([1,2,3,4,5])=>[1,2,3,4,5],0]
谢谢!你的回答也是正确的。但是其他人先来了。我确实学到了一些关于数组访问和空tho:-)我已经用rails的解决方案更新了我的答案,以防您使用它。:)Ruby的这种方法是Comments中所有解决方案中最快的。谢谢!您的代码也提供了正确的输出,而且是最短的!
def seq_sort(array)
  finished = [array.first], i = 0

  array.each_cons(2) do |(a,b)|
    if b - a == 1
      finished[i] << b
    else
      finished[i += 1] = [b]
    end
  end

  finished
end

> seq_sort([1,2,38,39,92,94,103,104,105,1002])
=> [[1,2], [38, 39], [92], [94], [103, 104, 105], [1002]]
[1, 2, 3, 5, 6, 7]
.unshift(0)
.each_cons(2).slice_before{|m, n| m + 1 < n}.map{|a| a.map(&:last)}
# => [[1, 2, 3], [5, 6, 7]]