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

时间:2011-11-17 07:39:25

标签: ruby

给出一些如下的数组:

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

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

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

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

4 个答案:

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