给定一个数组,例如
arr = [1,1,1,2,2,3,4,1,2]
我希望用该元素的单个实例替换每个连续的相等元素字符串。这里的结果是
[1,2,3,4,1,2]
三个1
s 由单个替换,1
两个2
s 由单个替换2
。
我怎样才能为任意的 Ruby 对象数组做到这一点?
我知道你可以用chunk_while
and做到这一点map
,但可能还有其他方法:
[1,1,1,2,2,3,4,1,2].chunk_while { |e, f| e == f }.map(&:first)
# [1, 2, 3, 4, 1, 2]
随着chunk_while
拆分的块阵列每当块被评估为真,则该块收益率两个变量中,“之前元素”和“后元”,这就是说,你会得到这样每次迭代:
[1, 1]
[1, 1]
[1, 2]
[2, 2]
[2, 3]
[3, 4]
[4, 1]
[1, 2]
在 proc 中应用逻辑后,只要第一个和第二个产生的元素相等,它就会对接收器进行分块,你会得到:
[[1, 1, 1], [2, 2], [3], [4], [1], [2]]
之后,您可以映射该结果以仅从每个数组中获取一个元素 - 有很多方法,但first
已经足够了。
该chunk_while
PROC也可以缩短到(&:==)
,留下的[1,1,1,2,2,3,4,1,2].chunk_while(&:==).map(&:first)
。
同样,出于好奇,您可以使用slice_when
和last
来保存 2 个字符:[1,1,1,2,2,3,4,1,2].slice_when(&:!=).map(&:last)
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句