按红宝石中的数字顺序分组编号

时间:2012-04-09 23:17:38

标签: ruby

我需要从数组中按数字顺序对数字进行分组。

(使用ruby 1.9.2,rails 3.2)

Example1:
[1,2,4,5,6]

Example2:
[1,3,4,6,7]

Example3:
[1,2,3,5,6]

Example4:
[1,2,4,5,7]

分组后

Example1:
[[1,2],[4,5,6]]

Example2:
[[1],[3,4],[6,7]]

Example3:
[[1,2,3],[5,6]]

Example4:
[[1,2],[4,5],[7]]

你明白了。 (我实际上在做的是分组天数,但不相关)

提前致谢!

3 个答案:

答案 0 :(得分:3)

我不确定你将这个操作称为什么,但它是一种基于最后处理元素的分组方法。类似的东西:

def groupulate(list)
  list.inject([ ]) do |result, n|
    if (result[-1] and result[-1][-1] == n - 1)
      result[-1] << n
    else
      result << [ n ]
    end

    result
  end
end

Enumerable模块提供了大量用于处理列表的实用方法,但到目前为止inject是最灵活的。

答案 1 :(得分:2)

使用inject(又名reduce)的完美问题:

def group_consecutive(arr)
  arr.inject([[]]) do |memo, num|
    if memo.last.count == 0 or memo.last.last == num - 1
      memo.last << num
    else
      memo << [ num ]
    end
    memo
  end
end

看到它在这里运行:http://rubyfiddle.com/riddles/0d0a5

答案 2 :(得分:1)

a = [1,2,4,5,7]
out = []
a.each_index do |i|
  if out.last and out.last.last == a[i]-1
    out.last << a[i]
  else
    out << [a[i]]
  end
end

puts out.inspect