【问题标题】:How to add to an array with an if method如何使用 if 方法添加到数组
【发布时间】:2015-06-28 20:27:17
【问题描述】:

我有一个这样的数字数组...

a= [28, 67, 20, 38, 4, 39, 14, 84, 20, 64, 7, 24, 17, 8, 7, 6, 15, 52, 4, 26]

我需要检查每个数字是否大于 30,如果是,那么我想计算该数字并计算有多少数字大于 30。我有这个,但到目前为止还没有工作

def late_items
    total_late = []
     if a.map { |i| i > 30}
      total_late << i
     end
    self.late_items = total_late.count
end

【问题讨论】:

  • 您只需要项目数还是还需要这些项目在数组中的位置?
  • map 总是返回一些东西,所以if 永远不会失败。

标签: ruby arrays methods


【解决方案1】:

count 方法可以传递一个块来指定应该计算什么样的元素。块返回 falsenil 的元素将被忽略。

在你的情况下,它可以归结为:

array.count { |element| element > 30 }

【讨论】:

    【解决方案2】:

    您可以使用select 来获取所有大于 30 的元素。

    a.select{|b| b > 30}.count
    # => 6 
    

    【讨论】:

      【解决方案3】:

      在 Ruby 中更简单:

      a = [28, 67, 20, 38, 4, 39, 14, 84, 20, 64, 7, 24, 17, 8, 7, 6, 15, 52, 4, 26]
      
      a.select{ |e| e > 30 }
      

      【讨论】:

      • 这给出了值,但不是计数。
      【解决方案4】:

      您似乎还想要超过 30 的每个项目的索引,如果是这样的话,这将起作用:

      a= [28, 67, 20, 38, 4, 39, 14, 84, 20, 64, 7, 24, 17, 8, 7, 6, 15, 52, 4, 26]
      count = 0
      pos = []
      a.each_with_index do |num, i|
          if num > 30
              count += 1
              pos << i
          end
      end
      
      puts count
      print pos
      
      #=> 6 [1,3,5,7,8,17]
      

      【讨论】:

      • 这在技术上是可行的,但利用更多的 Enumerable 库将显着减少您在这里要做的工作量。
      【解决方案5】:

      您也可以检查inject 方法。在它里面你可以很容易地得到大于 30 的数字的总和:

      a.inject(0) { |sum, n| n > 30 ? sum += n : sum }
      

      或者,如果您有一个大于 30 的数字数组,您可以使用 reduce 来汇总其项目。在您的 a 变量中,它看起来像:

      a.select{ |n| n > 30 }.reduce(&:+)
      

      【讨论】:

      • 第二种形式看起来确实清晰得多。三元组越少越好。
      • 这些给出了值的总和,而不是计数。不是 OP 要求的。
      • “那么我想计算那个数字并计算有多少数字大于 30”。正如我从那句话的第一部分理解的那样,他想总结那些大于 30 的数字,并得到数组中有多少这样的数字。
      • @DannyOcean 仍然只是在那里看到“count”这个词,而不是“sum”或“total”。此外,您的两个答案中没有任何内容涉及“......计算有多少数字大于 30。”
      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      相关资源
      最近更新 更多