如何将整数分组到 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
假设我在 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