如何使用块/ lambda表达式从Ruby中的数组中删除相同值的n个元素?

时间:2011-03-24 17:00:01

标签: ruby lambda

我正在学习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 个答案:

答案 0 :(得分:5)

class Array
  def remove_repeated(obj, limit)
    reject{|e| e == obj && (limit-=1) >= 0}
  end
end

Array.reject一次复制一个元素,除了块为真的元素。

答案 1 :(得分:0)

这个代码是你想要的吗?

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]

答案 2 :(得分:0)

我不知道您为什么要部分删除重复项,但如果您想在一个步骤中删除所有重复项:

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]