2015-01-12 4 views

ответ

5

Что вы описываете - это multiset. В стандартной библиотеке нет реализации, но вы можете использовать multiset gem.

require 'multiset' 

ms1 = Multiset.new([1, 2, 2, 4, 5, 6]) 
ms2 = Multiset.new([2, 1]) 

ms1 - ms2 
#=> #<Multiset:#1 2, #1 4, #1 5, #1 6> 

(ms1 - ms2).to_a 
#=> [2, 4, 5, 6] 
0

Вы можете найти каждого элемента index и удалите этот один, как показано на this answer:

array1 = [1,2,2,4,5,6] 
array2 = [2,1] 

array2.each { |obj| array1.delete_at(array1.index(obj) || array1.length) } 

array1 #=> [2, 4, 5, 6] 
+0

Я новичок в Ruby. Что делает «длина длины» в этом выражении? – user3718905

+0

'a || b' возвращает 'b', если' a' false, т. е. 'nil' или' false'. В приведенном выше коде 'array1.index (obj)' возвращает 'nil', если' obj' не найден в 'array1'. И поскольку 'array1.delete_at (nil)' приведет к ошибке, 'array1.delete_at (array1.length)' используется как резерв. – Stefan