如果<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
如果它是相同的,可以尝试一个计数器,但那不起作用。
答案 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"