如何替换数组中的重复元素?

时间:2016-02-01 20:01:33

标签: arrays ruby

我有一个数组:

[1, 4, 4, 4, 2, 9, 0, 4, 3, 3, 3, 3, 4]

并希望用字符串"repeat"替换重复值。索引412处的索引3389重复10 11 },[1, "repeat", 2, 9, 0, 4, "repeat", 4] 应该被替换。我应该得到:

pickle

这是如何完成的?

1 个答案:

答案 0 :(得分:9)

这有两种方法可以做到。

#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]]]
在Ruby v2.2中添加了

Object#itself。对于早期版本,您将使用

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中引入的。