我有一个数组:
[1, 4, 4, 4, 2, 9, 0, 4, 3, 3, 3, 3, 4]
并希望用字符串 "repeat"
替换重复值.重复4
在指数 1
, 2
, 3
和 3
在指数 8
, 9
, 10
, 11
应该更换。我应该得到:
[1, "repeat", 2, 9, 0, 4, "repeat", 4]
这是如何实现的?
请您参考如下方法:
您可以通过以下两种方式做到这一点。
#1 使用 Enumerable#chunk :
arr = [1,4,4,4,2,9,0,4,3,3,3,3,4]
arr.chunk(&:itself).map { |f,a| a.size==1 ? f : "repeat" }
#=> [1, "repeat", 2, 9, 0, 4, "repeat", 4]
步骤:
enum = arr.chunk(&:itself)
#=> #<Enumerator: #<Enumerator::Generator:0x007febc99fb160>:each>
我们可以通过将其转换为数组来查看此枚举器的元素:
enum.to_a
#=> [[1, [1]], [4, [4, 4, 4]], [2, [2]], [9, [9]], [0, [0]],
# [4, [4]], [3, [3, 3, 3, 3]], [4, [4]]]
Object#itself是在 Ruby v2.2 中添加的。对于早期版本,您将使用
enum = arr.chunk { |e| e }
现在根据需要映射 enum
的元素是一件简单的事情:
enum.map { |f,a| a.size==1 ? f : "repeat" }
#=> [1, "repeat", 2, 9, 0, 4, "repeat", 4]
#2 使用 Enumerable#slice_when
arr.slice_when { |e,f| e !=f }.map { |a| a.size==1 ? a.first : "repeat" }
步骤:
enum = arr.slice_when { |e,f| e !=f }
#=> #<Enumerator: #<Enumerator::Generator:0x007febc99b8cc0>:each>
a = enum.to_a
#=> [[1], [4, 4, 4], [2], [9], [0], [4], [3, 3, 3, 3], [4]]
a.map { |a| a.size==1 ? a.first : "repeat" }
#=> [1, "repeat", 2, 9, 0, 4, "repeat", 4]
slice_when
是在 Ruby v.2.2 中引入的。