Сравните два ruby-массива и верните похожие элементы - PullRequest
0 голосов
/ 23 января 2019

У меня есть два массива:

array1 = ["hello friend", "goodbye enemy", "yolo", "jello"]
array2 = ["ello", "random"]

Мне нужно написать метод, который возвращает массив элементов в array1, которые включают в строковый элемент любой из элементов в array2. Таким образом, метод должен вернуть:

["hello friend", "jello"]

Я пытался array1.reject{|i| array1.include? array2}, но он просто возвращает array1. Что мне делать?

Ответы [ 2 ]

0 голосов
/ 23 января 2019
array1 = ["hello friend", "goodbye enemy", "yolo", "jello", "Randomize"]
array2 = ["ello", "random"]

r = Regexp.new(Regexp.union(array2).source, 'i')
  #=> /ello|random/i  
array1.grep(r)
  #=> ["hello friend", "jello", "Randomize"] 

См. Regexp :: new , Regexp :: union , Regexp # source и Enumerable # grep .

0 голосов
/ 23 января 2019

Вы на правильном пути, но пропускаете некоторые основы.

  1. # reject выбирает те элементы, которые не удовлетворяют условию блока
  2. Ваше условие блока проверяет, соответствует ли элемент array1 всему массиву array2 - поскольку строка и массив никогда не совпадут, все элементы array1 не пройдут проверку и, следовательно, будут возвращены.

Развернув его, у вас есть следующие тесты:

"hello friend" == ["ello", "random"] # => false
"goodbye enemy" == ["ello", "random"] # => false
# etc

Предполагается, что вам нужны все элементы из массива1, для которых любой элемент в массиве 2 является подстрокой:

array1.select do |i|
  array2.any? {|j| i.include?(j) }
end

Это означает «выбрать все элементы из массива1, для которых любой элемент в массиве 2 является подстрокой элемента array1».

Развернутый, это дает вам следующие тесты:

"hello friend".include?("ello") # => true
"hello friend".include?("random") # => false
"goodbye enemy".include?("ello") # => false
"goodbye enemy".include?("random") # => false
# etc

#any? возвращает true, если какой-либо элемент в Enumerable соответствует условию блока, поэтому развернуто:

["ello", "random"].any? {|i| "hello friend".include?(i) } # => true
["ello", "random"].any? {|i| "goodbye enemy".include?(i) } # => false

Поскольку #select возвращает те элементы, для которых условие блока является истинным, будет возвращен «привет друг», а «прощай враг» - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...