Как мне удалить n элементов одного и того же значения из массива в Ruby, используя блочное / лямбда-выражение? - PullRequest
2 голосов
/ 24 марта 2011

Я нахожусь в процессе изучения Ruby, и я пытаюсь мыслить на Ruby. Однако, как бы я ни пытался, я не могу решить эту проблему:

Например, у меня есть следующий исходный массив:

a = [1, 3, 5, 4, 5, 5, 7, 5]

# param 1 = number matching, param 2 times matching
b = a.remove_repeated(5, 3)

Тогда значение b будет:

b = [1, 3, 4, 7, 5]

Если бы я пытался сопоставить только два значения, я бы тоже хотел, чтобы все они были удалены. Такие как:

a = [1, 4, 8, 4, 9, 2]
b = a.remove_repeated(4, 3)

Тогда значение b будет:

a = [1, 8, 9, 2]

Я знаю, как сделать это как итеративным, так и рекурсивным способом. Скорее, я ищу Rubyesque способ сделать это.

Ответы [ 3 ]

5 голосов
/ 24 марта 2011
class Array
  def remove_repeated(obj, limit)
    reject{|e| e == obj && (limit-=1) >= 0}
  end
end

Array.reject копирует массив по одному элементу за раз, за ​​исключением элементов, для которых блок имеет значение true.

0 голосов
/ 24 марта 2011

Не знаю, почему вы хотите частично удалить дубликаты, но если вы хотите удалить все дубликаты за один шаг:

a = [1, 3, 5, 4, 5, 5, 7, 5]

b = a.uniq
# => a = [1, 3, 5, 4, 5, 5, 7, 5], b = [1, 3, 5, 4, 7]

или

a.uniq!
# => a = [1, 3, 5, 4, 7]
0 голосов
/ 24 марта 2011

Это что-то вроде этого кода, что вы ищете?

class Array
  def remove_repeated(item, count)
    inject([]) do |filtered, current|
      filtered << current unless item==current && (count-=1) >= 0
      filtered
    end
  end
end

a = [1, 3, 5, 4, 5, 5, 7, 5]
p a.remove_repeated(5, 3) # => [1, 3, 4, 7, 5]

a = [1, 4, 8, 4, 9, 2]
p a.remove_repeated(4, 3) # => [1, 8, 9, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...