计算ruby数组中元素的连续出现次数

给定一些如下的数组:

x = ['a', 'b', 'b', 'c', 'a', 'a', 'a'] 

我希望最终能够显示每个元素按顺序重复多少次。 所以也许我最终会得到以下结果:

 [['a', 1], ['b', 2], ['c', 1], ['a', 3]] 

结果的结构并不重要……可能是其他一些需要的数据类型。

1.9为此目的有Enumerable#chunk

 x.chunk{|y| y}.map{|y, ys| [y, ys.length]} 

这不是一般解决方案,但如果您只需要匹配单个字符,则可以这样做:

 x.join.scan(/(\w)(\1*)/).map{|x| [x[0], x.join.length]} 

这是一线解决方案。 但是Matt建议的逻辑与x前面的nil一样正常:

 x.each_with_object([]) { |e, r| r[-1] && r[-1][0] == e ? r[-1][-1] +=1 : r << [e, 1] } 

这是我的方法:

 # Starting array arr = [nil, nil, "a", "b", "b", "c", "a", "a", "a"] # Array to hold final values as requested counts = [] # Array of previous `count` element previous = nil arr.each do |letter| # If this letter matches the last one we checked, increment count if previous and previous[0] == letter previous[1] += 1 # Otherwise push a new array for letter/count else previous = [letter, 1] counts.push previous end end 

我应该注意到,这并没有遭遇Matt Sanders所描述的同样问题,因为我们注意到我们第一次通过迭代。