2016-12-03 5 views
2

У меня есть два разных массивов строк, array1 и array2, в котором я хочу, чтобы выяснить, если элементы в array1 также существуют в array2 без изменения элементов в array1 , но значения в array1 включают дополнительные символы, включая и после двоеточия :.Как проверить, если элемент массива существует в другом массиве

array1 = ["unit 1 : Unit 1","unit 2 : Unit 2","unit 3 : Unit 3","test : Test", "system1"] 
array2 = ["unit 1","unit 2","unit 3","test"] 

Я попытался с помощью include?, но он не работает.

array1.each do |element| 
    #see if element exists in array 2 
    if array2.include? element 
     #print the name of that element 
     puts element 
    end 
end 

Как подойти к этому?

+0

Исправьте показать желаемый результат для вашего примера. –

ответ

3

Закрепление ваш подход, можно разделить element с space + : + space и получить first кусок для проверки. Вместо того, чтобы использовать if array2.include? element

if array2.include? element.split(' : ').first 

См Ruby demo

+0

Это не изменяет эльмы в массиве1? Если нет, это работает отлично! Спасибо – danynl

+0

Несомненно, массив остается неизменным. «Элемент» - это копия элемента реального массива в этом случае, см. Http://ideone.com/msEgJV –

2
# Gather the prefixes from array1, without modifying array1: 
array1_prefixes = array1.map { |s| s.split(" : ").first } 

# Figure out which elements array1 and array2 have in common 
common_elements = array1_prefixes & array2 
# => ["unit 1", "unit 2", "unit 3", "test"] 

Это решение основано на Array#& оператора, который выполняет пересечение множеств.

+0

Возможно, «единица 1: единица 1» .split (/ \ s *: \ s * /) # => ["unit 1", "Unit 1"] 'в случае, если на каждой стороне двоеточия нет ровно одного места (если такое поведение требуется для искателя). Альтернативно, «единица 1: единица 1» [/ .*? (? = \ S *:) /] # => «единица 1» '. –

0

Я думаю, что наиболее читаемый способ использования здесь может быть startwith?, но если вы знаете, что ключ не может быть подстрокой другого ключа.

Чтобы увидеть, если все ключи находятся в месте:

array2.all? do |item| 
    array1.any?{|keyval| keyval.startwith? item } 
end