测试数组元素与多个条件

时间:2017-11-16 21:26:23

标签: ruby

我正在尝试创建一个方法complex_check(n),它将执行以下操作:

  • 创建一个从0升级到n
  • 的整数数组
  • 根据复杂条件检查该数组的每个元素。

例如,我有一个来自0..n的数组,我想知道数组的哪些元素都可以被3整除,而不能被4整除。我可以索引来检查单个条件,如{ {1}}等,但有一种紧凑的方法可以根据多个条件检查每个整数吗?

3 个答案:

答案 0 :(得分:2)

这是我能想到的最好的,我认为这是你正在尝试做的事情:

def complex_check(n)
  check_array = (0..n).to_a
  check_array.select { |num|
    num % 3 == 0 &&
    num % 4 != 0
  }
end

然后使用它:

complex_check(15)
=> [3, 6, 9, 15]

答案 1 :(得分:2)

Ruby非常擅长的一件事是处理列表和其他常规数据结构。包括Array在内的许多常见的Enumerable扩展允许您快速过滤,拆分,分块,以及完全重写您正在处理的数据。通常可以做一些快速改动。

在这种情况下,select可用于过滤0到n范围内潜在候选人的不良值:

 def complex_check(n)
   (0..n).select do |v|
      v % 3 == 0 and v % 4 != 0 
   end
 end

这里的关键是使用select,其中任何返回逻辑真值的块都将是包含该元素的信号,否则将其排除。与此相反的是reject,其工作原理相同,只是反转逻辑。

您还可以动态传递这些过滤器:

def complex_check(n, *tests)
  tests.each_with_object((0..n).to_a) do |test, a|
    a.select!(&test)
  end
end

您的测试代码最终看起来像这样:

complex_check(
  50,
  -> (v) { v % 3 == 0 },
  -> (v) { v % 4 != 0 }
)

然后,您可以使用lambdas插入测试,这些是可重复使用的块。

答案 2 :(得分:0)

  • 创建一个从0到n的整数数组
如果你不必这样做,那就不要这样做,这几乎从来没有。 使用范围或枚举器。他们真的很容易:

0.upto(n).select do |i|  #0.upto(n) results in a Enumerator
  #complex criteria
end

#or

def complex_check(n)
  0.step(n,3).reject{|n| (n%4).zero?}  #0.step(n,3) is an Enumerator
end

p complex_check(15) #= [3, 6, 9, 15]