检查数组中的每个字符串是否包含在另一个字符串数组中

时间:2016-11-28 19:53:19

标签: arrays ruby

对不起,我是Ruby的新手(只是一个Java程序员),我有两个字符串数组:

  • 包含文件路径的数组。
  • 带有模式的数组(可以是路径或文件)

我需要检查每个"文件路径"上的每个模式。我这样做:

@flag = false
["aa/bb/cc/file1.txt","aa/bb/cc/file2.txt","aa/bb/dd/file3.txt"].each do |source|
  ["bb/cc/","zz/xx/ee"].each do |to_check|
    if source.include?(to_check)
      @flag = true
    end
  end 
end
puts @flag

此代码没问题,打印" true "因为" bb / cc"在源头。

我看过几个帖子但找不到更好的方法。我确信应该有一些功能允许我用更少的行来完成这项工作。 这有可能吗?

2 个答案:

答案 0 :(得分:4)

如@dodecaphonic所述,使用Enumerable#any?。像这样:

paths.any? { |s| patterns.any? { |p| s[p] } }

其中pathspatterns是OP定义的数组。

答案 1 :(得分:1)

虽然这样可行,但这会产生几何缩放问题,即必须对N个文件列表进行N * M测试,而不是M模式。您可以稍微优化一下:

files = ["aa/bb/cc/file1.txt","aa/bb/cc/file2.txt","aa/bb/dd/file3.txt"]

# Create a pattern that matches all desired substrings
pattern = Regexp.union(["bb/cc/","zz/xx/ee"])

# Test until one of them hits, returns true if any matches, false otherwise
files.any? do |file|
  file.match(pattern)
end

如果需要,可以将其包装在方法中。请记住,如果模式列表没有更改,您可能需要创建一次并保留它而不是不断地重新生成它。