【问题标题】:Ruby: How to compare elements one by one within an array?Ruby:如何在数组中逐个比较元素?
【发布时间】:2020-05-06 09:23:06
【问题描述】:

这是关于stackoverflow的第一个问题:)

考虑一个由任意整数组成的随机数组

a = [5, 10, 2, 3, 56]

我想编写一个代码,同样比较每个元素:索引 i (el_i) 的元素与索引 i + 1 (el_i+1) 的元素(并继续与元素索引 i + 1 (el_i+1) 进行比较) 具有索引 i + 2 (el_i+2) 直到 a.length 的元素。然后我想根据比较的结果对元素求和。这是一个失败的尝试描绘它的例子:

def conditional_sum(array)
  sum = 0
  array.each_with_index do |element, i|
    if array[i] >= array[i + 1]
      sum += element
    else
      sum -= element
    end
  end
  sum
end

另一个是从前一个数组中创建 2 个数组并删除最后一个元素(我省去了获取它们的代码),然后比较同样具有相同索引的元素:

a = [5, 10, 2, 3, 56]
a_bis = [5, 10, 2, 3]
b = [10, 2, 3, 56]  

sum = 0
for i in [0..a_bis.length]
  if a_bis[i] >= b[i] 
    sum += a_bis[i] + b[i]
  else
    sum -= a_bis[i] + b[i]
  end
end
p sum

也不行...非常感谢您的帮助!

【问题讨论】:

  • 你能发布该方法的预期输出吗?
  • 只是元素的总和(整数)
  • “也不起作用”不是一个足够精确的错误描述,我们无法帮助您。 什么不起作用? 如何不起作用?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?
  • 另外,请提供您希望发生的事情的精确规范,包括任何和所有规则、这些规则的例外情况、极端情况、特殊情况、边界案例和边缘案例。请提供示例输入和输出来展示您期望发生的情况,包括在正常情况下以及在所有例外情况、极端情况、特殊情况、边界情况和边缘情况下。单个示例不是规范,单个示例也不足以测试所有边界情况。
  • 根据your comment,您问题中示例的结果应为-62,但您将a solution 标记为正确,结果为0。你不能两全其美。 0 是正确的或-62 是正确的,它们不可能都正确。

标签: arrays ruby


【解决方案1】:

如果我理解了你的问题:

a = [5, 10, 2, 3, 56]

a.each_cons(2).sum do |first, second|
  first > second ? first - second : first + second
end
#=>87

#each_cons 会将它们组合成成对的连续元素:

a.each_cons(2) do |pair|
  p pair
end
#=>[5, 10]
#  [10, 2]
#  [2, 3]
#  [3, 56]

然后您可以对块内的每一对执行所需的计算。

【讨论】:

  • 你可以用sum代替map
  • 很好的开始,但没有完全回答:如果我拿我的数组 a,我希望代码执行以下操作:5 - 10 +2 - 3 - 56 = -62
  • @FrançoisCapel 你说你想要-62,但接受的答案是0。你为什么要在最后减去56?
  • 我的错误我一度感到困惑。我从上面的 Raphael Pr 中插入了代码,并添加了 #each_cons(2) bloc 中没有考虑到的最后一个缺少的元素,它现在可以工作了。
  • 目前还不清楚期望的结果是什么以及最后一个元素应该发生什么
【解决方案2】:

您的第一个示例几乎可以正常工作。尝试它会引发错误:

`>=': comparison of Integer with nil failed (ArgumentError)

这是因为对于索引的最后一次迭代,您将最后一个值 56nil 进行比较。即56 >= nil 对红宝石没有意义,因此错误。要修复它,您可以在没有最后一个元素的情况下进行迭代。与 ruby​​ 一样,它们有多种方法可以做到这一点。这是我的:

def conditional_sum(array)
  sum = 0
  # array[0...-1] will iterate without le last element
  array[0...-1].each_with_index do |element, i|
    if array[i] >= array[i + 1]
      sum += element
    else
      sum -= element
    end
  end
  sum
end

执行您想要的另一种解决方案是以下(更实用的样式)。使用#each_cons 选择每一对

def conditional_sum(array)
  array.each_cons(2)
    .sum {|i,j| i >= j ? i : -i}
end

【讨论】:

  • 等等!小心,你错过了这里的最后一个值:需要通过再次添加它来进行小修复,否则它会返回错误的结果。我必须将数组 [-1] 添加到返回值
  • 最后一个值的规则是什么?您始终可以添加到 sum 数组 [-1] 或将 0 值附加到您的输入数组
  • 正是如此,需要进行一个小修复以考虑到最后一个元素。再次感谢:)
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多