用Ruby比较数组中的两个项目

Ste*_*eve 4 ruby

我遇到了需要使用方法比较数组中两个元素的情况.我发现使用嵌套循环的逻辑非常简单,但这可能不是Ru​​by的好用.

对于前者 确定数组是否有任何一对等于0的2个数字:

def pairs(array)
  i = 0
  while i < array.length
    y = i + 1
    while y < array.length
      if array[i] + array[y] == 0
        return true
      end
      y += 1
    end
    i += 1
  end
  return false
end
Run Code Online (Sandbox Code Playgroud)

或者,如果我想看看数组中的两个东西是否相同,我将使用相同的逻辑,除了set:if array [i] == to array [y] ...

有人能为这样的问题提供更好的方法吗?

Jör*_*tag 13

通常,您可以将英语规范直接翻译成Ruby.

在第一个问题中,您询问两个元素的任何组合是否增加为零.当你想知道可枚举的任何元素是否为真时使用的方法是Enumerable#any?.如果要处理数组中元素的组合,请使用该方法Array#combination.对于求和,您可以使用Numeric#+Enumerable#inject,如果您想知道数字是否为零,您可以使用Numeric#zero?.

因此,您的第一个问题的可能实现将是:

ary.combination(2).any? {|pair| pair.inject(:+).zero? }
Run Code Online (Sandbox Code Playgroud)

你的第二个问题可以通过以下方式回答:

ary.combination(2).any? {|a, b| a == b }
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,当然还有其他方法可以做到这一点.例如,在第一种情况下,我们可以观察到两个数字总和为零的唯一方法是,如果一个是另一个的负数.

需要注意的是没有的,通常可以去错在一个循环可以在这里发生的事情.没有off-by-one错误,没有fencepost错误,没有错误的终止条件,没有迭代结束数组,只是因为没有循环.

  • 感谢Array#combination (2认同)