加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我可以更快地制作这个Ruby代码和/或使用更少的内存吗?

发布时间:2020-12-17 03:49:22 所属栏目:百科 来源:网络整理
导读:我在 Ruby中有一个String对象数组,它由下面的单词组成: 动物= [“猫马”,“狗”,“猫狗”,“狗羊”,“鸡牛”] 我想将它转换为另一个String对象数组,但每个元素只有一个动物,只有唯一的元素.我找到了一种方法,如下所示: class Array def process() self.joi
我在 Ruby中有一个String对象数组,它由下面的单词组成:

动物= [“猫马”,“狗”,“猫狗”,“狗羊”,“鸡牛”]

我想将它转换为另一个String对象数组,但每个元素只有一个动物,只有唯一的元素.我找到了一种方法,如下所示:

class Array
  def process()
    self.join(" ").split().uniq
  end
end

但是,如果输入数组是巨大的,让我们说数百万个条目然后执行这将是非常糟糕的因为我将创建一个巨大的字符串,然后一个巨大的数组然后uniq必须处理该巨大的数组以删除重复的元素.我想要加快速度的一种方法是创建一个带有每个单词条目的哈希,这样我只会在第一遍中处理每个单词一次.有没有更好的办法?

解决方法

你有正确的想法.但是,Ruby有一个内置类,非常适合构建一组独特的项目: Set.

animals = ["cat horse","dog","cat dog bird","dog sheep","chicken cow"]

unique_animals = Set.new

animals.each do |str|
  unique_animals.merge(str.split)
end
# => cat
#    horse
#    dog
#    bird
#    sheep
#    chicken
#    cow

要么…

unique_animals = animals.reduce(Set.new) do |set,str|
  set.merge(str.split)
end

在封面设置actually uses a Hash以存储其项目,但它更像是一个无序的数组,并响应所有熟悉的Enumerable方法(每个,地图,选择等).但是,如果您需要将其转换为真正的数组,请使用Set#to_a.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读