如何检查一个数组的所有元素都大于并行数组中的对应元素(在Ruby中).

Dar*_*s22 4 ruby

我试图比较两个数组,以确保一个的相应值总是大于另一个.

a = [2, 3, 4]
b = [1, 2, 3]

# a[0] > b[0] ... a[x] > b[x]
Run Code Online (Sandbox Code Playgroud)

此时我正在考虑使用inject索引并在比较失败时返回,如:

b.each_with_index.inject(true) do |cmp, (element,index)|
  if element > a[index] do
    cmp = false
    return
  end
end
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?有点像Ruby或Rails的感觉可能已经有类似内置的东西,我错过了它.

Mic*_*ohl 8

这就是我要做的:

 a.zip(b).all? { |a, b| a > b }
Run Code Online (Sandbox Code Playgroud)

请注意zip,如果两个数组的大小不同,则会截断.


Jak*_*mer 5

如果可以安全地假设两个阵列的大小相同,那么这是一种将内存使用和运行时间降至最低的方法:

(0...a.length).all?{ |i| a[i] > b[i] }
 #=> true
Run Code Online (Sandbox Code Playgroud)

同时还可以扩展到任意数量的数组:

(0...a.length).all?{ |i| a[i] > [b[i], c[i], d[i]].max }
Run Code Online (Sandbox Code Playgroud)

为了说明的相对资源强度zip相对于range方法中,采取阵列ab,每个具有长度n = 5_000.

这里是最好的情况下,如果a[0] < b[0]false:

             user     system      total        real
zip:     0.350000   0.000000   0.350000 (  0.351115)
range:   0.000000   0.000000   0.000000 (  0.000509)
Run Code Online (Sandbox Code Playgroud)

而最差的,只有a[n-1] > b[n-1]false:

             user     system      total        real
zip:     0.760000   0.000000   0.760000 (  0.752424)
range:   0.420000   0.000000   0.420000 (  0.421132)
Run Code Online (Sandbox Code Playgroud)

[ 这是基准脚本 ]

zip从你传入它的两个(或更多)中创建一个新数组,这对于大型数据来说是昂贵的n.

也就是说,这种zip方法更容易阅读,更方便的Ruby,所以如果缩放不是一个问题,我会使用那个.