Устранить последовательные дубликаты элементов списка - PullRequest
6 голосов
/ 05 апреля 2011

Какое лучшее решение для устранения последовательных дубликатов элементов списка?

list = compress(['a','a','a','a','b','c','c','a','a','d','e','e','e','e']).
p list # => # ['a','b','c','a','d','e']

У меня есть это:

def compress(list)
  list.map.with_index do |element, index| 
    element unless element.equal? list[index+1]
  end.compact
end

Ruby 1.9.2

Ответы [ 5 ]

23 голосов
/ 05 апреля 2011

Хорошая возможность использовать Enumerable#chunk, если ваш список не содержит nil:

list.chunk(&:itself).map(&:first)

Для Ruby старше 2.2.x вы можете require "backports/2.2.0/kernel/itself" или использовать {|x| x} вместо (&:itself).

Для Ruby старше 1.9.2 вы можете require "backports/1.9.2/enumerable/chunk" получить его чистую версию Ruby.

6 голосов
/ 05 апреля 2011

Сделайте это (при условии, что каждый элемент представляет собой один символ)

list.join.squeeze.split('')
3 голосов
/ 05 апреля 2011

Ruby 1.9 +

list.select.with_index{|e,i| e != list[i+1]}

в отношении @sawa, который рассказал мне о with_index:)

Как заметил @ Marc-André Lafortune, если nil вконец вашего списка это не будет работать для вас.Мы можем исправить это с помощью этой уродливой структуры

list.select.with_index{|e,i| i < (list.size-1) and e != list[i+1]}
1 голос
/ 05 апреля 2011
# Requires Ruby 1.8.7+ due to Object#tap
def compress(items)
  last = nil
  [].tap do |result|
    items.each{ |o| result << o unless last==o; last=o }
  end
end
list = compress(%w[ a a a a b c c a a d e e e e ])
p list
#=> ["a", "b", "c", "a", "d", "e"]
0 голосов
/ 20 мая 2018
arr = ['a','a','a','a','b','c','c','a','a','d','e','e','e','e']

enum = arr.each
  #=> #<Enumerator: ["a", "a", "a", "a", "b", "c", "c", "a", "a", "d",
  #                  "e", "e", "e", "e"]:each>
a = []
loop do
  n = enum.next
  a << n unless n == enum.peek
end
a #=> ["a", "b", "c", "a", "d"]

Enumerator # peek вызывает исключение StopIteration, когда оно уже вернуло последний элемент перечислителя. Ядро # loop обрабатывает это исключение, прерывая цикл.

См. Массив # каждый и Перечислитель # следующий . Ядро # to_enum 1 может использоваться вместо Array#each.

1 to_enum - это метод экземпляра Object, определенный в модуле Kernel, но задокументированный в классе Object. Понял?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...