【问题标题】:Ruby select method: check number of items that are selectedRuby 选择方法:检查被选择的项目数
【发布时间】:2016-12-08 05:10:21
【问题描述】:

因此,Ruby 有一个 select 方法,它可以根据从块中传入的条件从数组中选择元素。

例如

arr = [1,2,3,4]
arr.select {|x| x.even? } => [2, 4]

我的问题涉及一个大数组,我只想选择一定数量的项目。例如,在数组中,我只想要符合条件的前 5 个数字。

arr.select{|x| x.even?}[0...5]

这是我目前所拥有的。这非常慢,因为 Ruby 在选择前五个元素之前对整个数组运行 select 函数。

我想看看是否有办法在选择前五个元素时停止选择功能。

例如,如果我能做到这一点

res = arr.select do |x|
  x.even? 
  break if self.length > 5
end

在这种情况下,self 是对 res 数组的引用。我不认为该参考会起作用,但我希望它能够传达我的观点。

【问题讨论】:

    标签: arrays ruby algorithm methods


    【解决方案1】:

    在这种情况下,self 是对 res 数组的引用。

    Ruby 中的关键字self 让您可以访问当前对象——接收当前消息的对象。

    我认为这是Enumerator::Lazy的工作:

    >> (1..100000).lazy.select { |x| x.even? }.first(5)
    => [2, 4, 6, 8, 10]
    

    【讨论】:

    • 这正是我所需要的。非常感谢。
    【解决方案2】:

    lazy 是为此量身定做的,但你也可以写

    1.step.each_with_object([]) do |x, arr|
       arr << x if x.even?
       break arr if arr.size == 5
    end
      #=> [2, 4, 6, 8, 10]
    

    另外,Enumerator#lazy 在 Ruby v2.0 中看到了曙光,Enumerable#each_with_object 在 v1.9 中,Enumerable#reduce(又名inject),也可以更早地使用,所以您可以选择方法可能取决于您希望支持的最早版本的 Ruby。还有一件事:如果效率很重要,您可能需要进行基准测试,因为 lazy 以相对较慢而闻名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多