2017-01-24 5 views
0

Я видел много вопросов относительно этого, но не тот, который решает проблему дублирования значений.Сравнение массива Ruby без удаления дубликатов

Ниже представлены два массива. Мне нужно подтвердить, что ary2 включен в ary1 независимо от дополнительных дубликатов. Также необходимо работать независимо от того, хранятся ли массивы числа или символы.

ary1 = [1, 1, 1, 2, 2, 3, 4, 5, 6] 
ary2 = [1, 1, 2, 3, 5] 

Если равен [1, 1, 2, 3, 5], мой код равен [1, 1, 1, 2, 2, 3, 5]

Пробовал много вариантов, в том числе keep_if или keep_at, delete_if или delete_at, slice, map и т.д.

Текущий код:

ary1.keep_if { |x| ary2.include?(x) } 
+1

Вы говорите, что хотите проверить, что 'ary2' включен в' ary1'. Для этого требуется ответ «истинный» или «ложный», но затем вы должны сказать, что ответ должен быть «[1,1,2,3,5]». Это бессмысленно. Предположим, что 'ary1 = [1]' и 'ary2 = [1,1]'. В его случае «ary2» «включено» в 'ary1'? Измените свой вопрос, чтобы уточнить, что вы просите. –

ответ

3

проверить ary2 включен в ary1

(ary2 - ary1).empty? 

должна равняться [1, 1, 2, 3, 5]

ary2.select { |e| ary1.include?(e) } 
+0

Отлично работает. Что делать, если я хочу найти то, что осталось в ary1 после выбора. Я попытался отклонить, но также удаляет дубликаты. –

+0

ary1.select {| e | ary2.include? (e)} – JLB

0

Чтение между строк, я предполагаю, что "ary2 является включен в ary1 "означает, что для каждого элемента ary2, th являющийся уникальным элементом ary1 с тем же значением. Под «уникальным» я имею в виду, например, что если ary2 содержит два 1, то ary1 должен содержать два или более 1. Если эта интерпретация вопроса неверна, нет никаких оснований для дальнейшего изучения.

Если мое предположение верно, то мы могли бы построить метод (с аргументами ary1 и ary2), который возвращает true или false, но если есть совпадение (true), может быть более полезным, чтобы вернуть элементы ary1, которые «left over» после того, как элементы ary1 были сопоставлены с элементами ayr2.

def ary2_included_in_ary1?(ary1, ary2) 
    ary1_cpy = ary1.dup 
    ary2.all? do |n| 
    idx = ary1_cpy.index n 
    return false if idx.nil? 
    ary1_cpy.delete_at(idx) 
    end 
    ary1_cpy 
end 

ary1 = [1, 1, 1, 2, 2, 3, 4, 5, 6] 

ary2 = [1, 1, 2, 3, 5] 
ary2_included_in_ary1?(ary1, ary2) 
    #=> [1, 2, 4, 6] 

ary2 = [1, 1, 2, 3, 7] 
ary2_included_in_ary1?(ary1, ary2) 
#=> false 

 Смежные вопросы

  • Нет связанных вопросов^_^