Удаление элементов из массива Ruby
допустим, я пытаюсь удалить элементы из массива a = [1,1,1,2,2,3]. Если я выполняю следующее:
b = a - [1,3]
тогда я получу:
b = [2,2]
однако, я хочу, чтобы результат был
b = [1,1,2,2]
т. е. я удаляю только один экземпляр каждого элемента в вычитаемом векторе не во всех случаях. Есть ли простой способ в Ruby сделать это?
5 ответов:
вы можете:
a= [1,1,1,2,2,3] delete_list = [1,3] delete_list.each do |del| a.delete_at(a.index(del)) endрезультат : [1, 1, 2, 2]
[1,3].inject([1,1,1,2,2,3]) do |memo,element| memo.tap do |memo| i = memo.find_index(e) memo.delete_at(i) if i end end
не очень просто, но:
a = [1,1,1,2,2,3] b = a.group_by {|n| n}.each {|k,v| v.pop [1,3].count(k)}.values.flatten => [1, 1, 2, 2]также обрабатывает случай для кратных в "subtrahend":
a = [1,1,1,2,2,3] b = a.group_by {|n| n}.each {|k,v| v.pop [1,1,3].count(k)}.values.flatten => [1, 2, 2]EDIT: это больше улучшение, сочетающее Norm212 и мой ответ, чтобы сделать "функциональное" решение.
b = [1,1,3].each.with_object( a ) { |del| a.delete_at( a.index( del ) ) }поместите его в лямбду, если это необходимо:
subtract = lambda do |minuend, subtrahend| subtrahend.each.with_object( minuend ) { |del| minuend.delete_at( minuend.index( del ) ) } endзатем:
subtract.call a, [1,1,3]
a = [1,1,1,2,2,3] a.slice!(0) # remove first index a.slice!(-1) # remove last index # a = [1,1,2,2] as desired
Comments