【问题标题】:Compare an element from one array with an element from another array将一个数组中的元素与另一个数组中的元素进行比较
【发布时间】:2017-12-15 20:28:12
【问题描述】:

我有两个大小相同的数字数组。如何判断第二个数组中是否有任何元素大于给定索引处的第一个数组?用这个例子:

a = [2, 8, 10]
b = [3, 7, 5]

3 在位置 0 处大于 2。但在下面:

a = [1, 10]
b = [0, 8]

没有这样的元素。在索引00 不大于1,在索引18 不大于10

【问题讨论】:

  • 输出应该是什么样的?
  • 它可以是真也可以是假

标签: arrays ruby


【解决方案1】:

试试这个

a.each_with_index.any? { |item, index| b[index] > item }

【讨论】:

  • 哪个读起来更好,你有什么或a.each_index.any? { |index| b[index] > a[index] }
  • 我更喜欢你的 :D
  • @CarySwoveland 你的也更快。
【解决方案2】:

不需要索引。只需将它们配对并检查每一对。

b.zip(a).any? { |x, y| x > y }
=> true or false

还有一个棘手的问题:检查是否在每个位置,a 是最大值:

a.zip(b).map(&:max) != a
=> true or false

而且非常高效(时间和空间):

b.zip(a) { |x, y| break true if x > y }
=> true or nil

(如果您需要true/false(通常不需要,例如在if-conditions 中),您可以在前面加上!! 或附加|| false

【讨论】:

  • 我可以说“不需要新数组”:D
  • @Ursus 好吧,那么我可以说“无需假设新数组是坏的”或者我可以在其中插入一个.lazy :-)
  • 这是迄今为止最干净的答案。 b.lazy.zip(a).any? { |x, y| x > y } 可能会好一点,是的。
  • @mudasobwa 这真的取决于使用情况。对于像 OP 示例这样的小案例,添加 .lazy 只会不必要地使代码混乱并使其变慢。无论如何...我刚刚添加了另一个在时间和空间上都非常有效的解决方案。
【解决方案3】:

如果b 中的数字在给定索引处大于a 中的数字,这将返回b 中的数字。如果b 中没有大于的数字,则返回nil

b.detect.with_index { |n, index| n > a[index] }

例如,如果您有以下数组。

a = [3, 4, 5]
b = [6, 7, 8]

你会得到6的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多