比较两个红宝石数组并返回相似的项目

时间:2019-01-23 16:36:06

标签: arrays ruby

我有两个数组:

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

我需要编写一个方法,该方法返回array1中的元素数组,这些元素包含在字符串项目中,而array2中的任何项目都包括在内。因此该方法应返回:

["hello friend", "jello"]

我尝试过array1.reject{|i| array1.include? array2},但它只返回array1。我该怎么办?

2 个答案:

答案 0 :(得分:2)

您步入正轨,但缺少一些基本知识。

  1. #reject选择那些满足阻止条件的元素
  2. 您的阻止条件是测试array1的元素是否与整个array2数组匹配-由于字符串和数组将永远不匹配,因此array1的所有元素均未通过测试,因此被返回。

展开它,您将进行以下测试:

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

假设您希望来自array1的所有元素,其中array2中的任何元素都是子字符串:

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

这意味着“选择array1中所有元素,其中array2中的任何元素都是array1元素的子字符串”。

展开,这将为您提供以下测试:

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

#any?如果Enumerable中的任何元素匹配块条件,则返回true,因此展开:

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

由于#select返回了其阻止条件为true的那些元素,因此将返回“你好朋友”,而不会返回“再见敌人”。

答案 1 :(得分:2)

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::newRegexp::unionRegexp#sourceEnumerable#grep