У меня есть два массива:Получить точные различия двух массивов
array1 = [1,2,2,4,5,6]
array2 = [2,1]
Как получить
array3 = [2,4,5,6]
Я попытался array1 - array2
, но он возвращает [4,5,6]
.
У меня есть два массива:Получить точные различия двух массивов
array1 = [1,2,2,4,5,6]
array2 = [2,1]
Как получить
array3 = [2,4,5,6]
Я попытался array1 - array2
, но он возвращает [4,5,6]
.
Что вы описываете - это 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]
Вы можете найти каждого элемента 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]
Я новичок в Ruby. Что делает «длина длины» в этом выражении? – user3718905
'a || b' возвращает 'b', если' a' false, т. е. 'nil' или' false'. В приведенном выше коде 'array1.index (obj)' возвращает 'nil', если' obj' не найден в 'array1'. И поскольку 'array1.delete_at (nil)' приведет к ошибке, 'array1.delete_at (array1.length)' используется как резерв. – Stefan