如何从 Ruby Array 中删除重复的连续元素,但不是所有重复的元素?

Axi*_*ger 1 ruby arrays

鉴于数组:

arr = ['a','a','b','b','b','a','c']
Run Code Online (Sandbox Code Playgroud)

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

['a','b','a','c']
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的。可以按如下方式遍历 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
Run Code Online (Sandbox Code Playgroud)

Urs*_*sus 5

试试这个

arr.chunk_while(&:==).map(&:first)
Run Code Online (Sandbox Code Playgroud)

第一步,arr.chunk_while(&:==)制作一个由等值数组组成的数组。您可以使用 看到第一步的结果arr.chunk_while(&:==).to_a。第二步,map(&:first)取每个子阵列的第一项,最后将这个 n 子阵列阵列展平。

  • 请注意,从 Ruby 2.2 开始,第一步也可以写成 `arr.chunk(&amp;:itself)`。此外,您的解决方案适用于 `map`,无需在此处使用 `flat_map`。 (2认同)
  • 如果数组包含单个字母,那么您可以使用 `arr.join.squeeze.split('')` 或代替 chunk while 或 flat_map 使用: `arr.chunk(&amp;:itself).map(&amp;:first)` 它更优化谢谢! (2认同)