如何将整数分组到 Ruby 数组中以便压缩数组?

How do I group integers in a Ruby array so that I can compress the array?

假设我在 Ruby 2.1+ 中有一个整数数组,例如:

[2, 4, 4, 1, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5]

我想做的是压缩数组,以便得到类似的东西:

[2, [4, 2], 1, 6, 7, [5, 8]]

注意两个内部数组只包含两个元素。重复的值和次数。

此外,顺序很重要。

**编辑*

抱歉,我没有提到单个元素,我不关心计数。所以 [2,1]...[1,1],[6,1]... 与我无关。

事实上,我真的只对有 4 个或更多重复整数的组感兴趣,但我不想混淆这个问题。所以 [3,2] 可以保留为 3,3[3,4] 将被用来代替 3,3,3,3 但这对于问题的主题并不重要。

谢谢!

对于Ruby 2.2:

[2, 4, 4, 1, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5]
.slice_when(&:!=)
.map{|a| a.length == 1 ? a.first : [a.first, a.length]}
# => [2, [4, 2], 1, 6, 7, [5, 8]]

老 Ruby:

[2, 4, 4, 1, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5]
.chunk{|e| e}
.map{|e, a| a.length == 1 ? e : [e, a.length]}
# => [2, [4, 2], 1, 6, 7, [5, 8]]

不如其他人效率高,但还好。

编辑: 如下所述,这是 如何做到这一点的示例。 Ruby 在数组 class 中内置了一个惊人的方法库,应该使用它而不是使用索引。

arr = [2, 4, 4, 1, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5]
tempArr = []
newArr = []
for i in 0..(arr.length - 1)
    if arr[i] == arr[i + 1] && arr[i] != arr[i - 1]
        tempArr = [arr[i], 1]
    elsif tempArr[0] == arr[i]
        tempArr[1] += 1
        if arr[i - 1] == arr[i] && arr[i + 1] != tempArr[0]
            newArr.push(tempArr)
        end
    elsif arr[i] != tempArr[0]
        newArr.push(arr[i])
        if tempArr[0] != nil
            tempArr = []
        end
    end
end