计算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所描述的同样问题,因为我们注意到我们第一次通过迭代。