我需要从数组中按数字顺序对数字进行分组。
(使用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]]
你明白了。 (我实际上在做的是分组天数,但不相关)
提前致谢!
答案 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