Ruby从大量范围中获得第n个项目

Posted

技术标签:

【中文标题】Ruby从大量范围中获得第n个项目【英文标题】:Ruby get nth item from massive range 【发布时间】:2011-02-13 12:30:19 【问题描述】:

假设我有这个范围:

("aaaaa".."zzzzz")

如何在不事先/每次都生成整个内容的情况下从范围中获取第 N 个项目?

【问题讨论】:

你到底需要用这个做什么?您是否尝试生成随机字符串? 【参考方案1】:

快速简便的方法:

("aaaaa".."zzzzz").first(42).last  # ==> "aaabp"

如果由于某种原因您必须一遍又一遍地执行此操作,或者如果您需要避免为前 N 个元素构建中间数组,您可以编写如下内容:

module Enumerable
  def skip(n)
    return to_enum :skip, n unless block_given?
    each_with_index do |item, index|
      yield item unless index < n
    end
    self
  end
end

("aaaaa".."zzzzz").skip(41).first # ==> "aaabp"

注意:我假设您想要一个适用于任何 Enumerable 的解决方案,而不是适用于字母范围的解决方案(在这种情况下,您应该直接计算它)。我也假设 Ruby 1.8.7+,否则升级或require "backports"

【讨论】:

我不知道['list'].first(n)...太棒了!【参考方案2】:

只枚举到 n,

开发一个给定数字 n 的函数,f(n) 为您提供可能解决方案范围中的第 n 项。

在您的情况下,您可以将您的范围视为以 26 为底的数字系统。重新调整数字是一个众所周知的问题。即使在红宝石(由我的同事制作)中,也有一个example on my site 可以从以 10 为底的数字变为以 26 为底的数字(由字母表表示)。此算法的某些变体可能也适用于您。

更新 也许这不是你的答案:D

这里是获取范围内第 n 项的 ruby​​ 代码:

def rbase(value)
  a = ('a'..'z')
  b = a.to_a
  base = b.length
  text = []
  begin 
    value, rest = value.divmod(base)
    text << b[rest]
  end until value.zero?
  text.reverse.join
end

那么你可以这样使用它。

irb(main):030:0> rbase(789).rjust(10,'a')
=> "aaaaaaabej"

【讨论】:

以上是关于Ruby从大量范围中获得第n个项目的主要内容,如果未能解决你的问题,请参考以下文章

从列表(表)末尾获取第 n 个元素

从列表中删除特定项目范围

欧拉项目第五题

如何从 List<T> 中获取每个第 n 个项目?

从 DynamoDB 中删除大量项目的推荐方法是啥?

Ruby on Rails,将项目范围的单引号转换为双引号