如何对相同的相邻数字进行分组

时间:2017-04-24 11:17:30

标签: ruby

如果<number : number_of_occurrences >格式中至少有两个相邻的数字相同,我需要打包。

这是我的意见:

[2,2,2,3,4,3,3,2,4,4,5]

预期的产出:

"2:3,3,4,3:2,2,4:2,5"

到目前为止,我试过了:

a = [1, 1, 1, 2, 2, 3, 2, 3, 4, 4, 5]
a.each_cons(2).any? do |s , t|
  if s == t

如果它是相同的,可以尝试一个计数器,但那不起作用。

3 个答案:

答案 0 :(得分:7)

您可以使用Enumerable#chunk_while(如果您使用Ruby&gt; = 2.3):

a.chunk_while { |a, b| a == b }
 .flat_map { |chunk| chunk.one? ? chunk.first : "#{chunk.first}:#{chunk.size}" }
 .join(',')
#=> "2:3,3,4,3:2,2,4:2,5"

你也可以使用Enumerable#chunk(Ruby~1.9.3,也许更早):

a.chunk(&:itself)
 .flat_map { |_, chunk| chunk.one? ? chunk.first : "#{chunk.first}:#{chunk.size}" }
 .join(',')
#=> "2:3,3,4,3:2,2,4:2,5"

答案 1 :(得分:3)

当它们相等时你可以将chunk个元素放在一起,你也可以slice在不同的元素之间的数组{{3}}已经在Ruby 2.2中添加了:

slice_when

这主要是品味问题,两种方法都可以达到完全相似的效果,就像[2, 2, 2, 3, 4, 3, 3, 2, 4, 4, 5].slice_when { |a, b| a != b }.map do |ints| if ints.size == 1 ints[0] else "#{ints[0]}:#{ints.size}" end end.join(',') # "2:3,3,4,3:2,2,4:2,5" select一样。

答案 2 :(得分:1)

arr = [2, 2, 2, 3, 4, 3, 3, 2, 4, 4, 5]

arr.drop(1).each_with_object([[arr.first, 1]]) do |e,a|
  a.last.first == e ? a[-1][-1] += 1 : a << [e, 1]
end.map { |a| a.join(':') }.join(',')
  #=> "2:3,3:1,4:1,3:2,2:1,4:2,5:1"