【问题标题】:Compare two ruby arrays and return similar items比较两个 ruby​​ 数组并返回相似的项目
【发布时间】:2019-06-17 07:28:36
【问题描述】:

我有两个数组:

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

我需要编写一个方法,该方法返回 array1 中的元素数组,这些元素在字符串项中包含 array2 中的任何项。所以该方法应该返回:

["hello friend", "jello"]

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

【问题讨论】:

标签: arrays ruby


【解决方案1】:
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

【讨论】:

  • 如果array2 包含元字符,可能会遇到问题。很遗憾Regexp.union 不接受选项,因此您不得不执行Regexp.new(Regexp.union(array).source, 'i')/#{array.map { |s| Regexp.escape(s) }.join('|')}/i 之类的操作来正确转义可能的元字符。
【解决方案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 返回了那些阻止条件为真的元素,“你好朋友”将被返回,而“再见敌人”则不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2015-07-19
    相关资源
    最近更新 更多