1

我需要对数组中按数字顺序排列的数字进行分组。

(使用 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]]

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

提前致谢!

4

3 回答 3

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它是迄今为止最灵活的。

于 2012-04-09T23:36:03.410 回答
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

于 2012-04-09T23:42:34.913 回答
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
于 2012-04-09T23:34:41.380 回答