我正在学习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的方式。
答案 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]