【问题标题】:How do you remove repeated consecutive elements, but not all duplicate elements from a Ruby Array? [duplicate]如何从 Ruby 数组中删除重复的连续元素,但不是所有重复的元素? [复制]
【发布时间】:2018-10-29 18:10:56
【问题描述】:

给定数组:

arr = ['a','a','b','b','b','a','c']

在 Ruby 中是否有一种快速的方法可以删除重复的连续元素,但并非所有重复的元素都像 arr.uniq 一样?预期的输出是:

['a','b','a','c']

这是我尝试过的。可以按如下方式遍历 Array,但是在 Ruby 中最简洁的方法是什么?

def remove_repeats arr
  new_arr       = []
  last_element  = nil
  arr.each do |x|
    if last_element != x
      new_arr << x
    end
    last_element = x
  end
  new_arr
end

arr = ['a','a','b','b','b','a','c','c']
puts remove_repeats(arr).join(',')

# => a,b,a,c

【问题讨论】:

  • 这可能是重复的,我正在寻找如何专门对Array类进行操作。另一个问题涉及更具体的术语列表,我猜我也可以搜索。另一个问题几乎不使用术语 Array(仅在少数 cmets 中),它是实际使用的类。这也是我使用 Array(大写)的原因,它是一个类。

标签: arrays ruby


【解决方案1】:

试试这个

arr.chunk_while(&:==).map(&:first)

第一步,arr.chunk_while(&amp;:==),创建一个等值数组'。您可以使用arr.chunk_while(&amp;:==).to_a 查看第一步的结果。第二步,map(&amp;:first),获取每个子数组的第一项,最后将这个 n 子数组数组展平。

【讨论】:

  • 谢谢!这很巧妙,我将把这个问题留给任何其他输入,但这是我期望存在的那种红宝石单线答案。
  • 注意,从 Ruby 2.2 开始,第一步也可以写成arr.chunk(&amp;:itself)。此外,您的解决方案适用于 map,无需在此处使用 flat_map
  • 如果数组 conatin 在单个字母上,那么您可以使用 arr.join.squeeze.split('') 或块的 instead 而或 flat_map 使用:arr.chunk(&amp;:itself).map(&amp;:first) 它更优化谢谢!
  • 如果你有facets gem 链接:github.com/rubyworks/facets 那么你可以简单地使用arr.squeeze! ref:rubydoc.info/github/rubyworks/facets/Array:squeeze
  • 谢谢大家的建议:)
【解决方案2】:

试试arr.uniq!,它会删除所有重复项。

【讨论】:

  • 用户不想要 uniq 值。阅读问题
  • 对不起,我的错。
猜你喜欢
  • 2020-05-08
  • 2019-03-23
  • 2011-08-09
  • 2016-12-08
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多