给出一些如下的数组:
x = ['a', 'b', 'b', 'c', 'a', 'a', 'a']
我希望最终能够显示每个元素按顺序重复多少次。所以也许我最终会得到以下结论:
[['a', 1], ['b', 2], ['c', 1], ['a', 3]]
结果的结构并不重要......可能是其他一些需要的数据类型。
答案 0 :(得分:24)
1.9有Enumerable#chunk
:
x.chunk{|y| y}.map{|y, ys| [y, ys.length]}
答案 1 :(得分:1)
这不是一般解决方案,但如果您只需要匹配单个字符,就可以这样做:
x.join.scan(/(\w)(\1*)/).map{|x| [x[0], x.join.length]}
答案 2 :(得分:1)
这是一线解决方案。然而,与Matt建议的逻辑相同,在x:
前面的nil可以正常工作x.each_with_object([]) { |e, r| r[-1] && r[-1][0] == e ? r[-1][-1] +=1 : r << [e, 1] }
答案 3 :(得分:0)
这是我的方法:
# 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描述的同样问题,因为我们注意到我们第一次通过迭代。