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

标签 arrays ruby

我有一个数组:

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

并希望用字符串 "repeat" 替换重复值.重复4在指数 1 , 2 , 33在指数 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 中引入的。

关于arrays - 如何替换数组中的重复元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35139261/

相关文章:

ruby - 我应该如何处理 APP_KEY 和 APP_SECRET(Dropbox API)

ruby-on-rails - 您要查找的页面不存在 - heroku+rails

Ruby 将所有空格减少为单个空格

ruby - Ruby 中的左移是什么意思?

javascript - 数组文字何时创建?

java - 检查同一数组上的两个重复字符是否位于最后一个位置。但其中一个角色处于最后一个位置

javascript - Angular 1.x ng-repeat 显示数据,而直接模板绑定(bind)不显示

ruby - 当我在我的模型上运行 RSpec 时,为什么会出现 "strip"和 "downcase"的未定义方法错误?

javascript - 数组.map : get the index of each element to use in the return function

java - 为什么我的掷骰子程序卡住了?