ruby - 优化这个ruby循环结构

标签 ruby loops

给定事实列表,测试事实 is_real?,如果 speaker 属性未同时说明 alternative_facts,则仅返回 passing_facts。

passing_facts, alternative_facts = []
@facts.each do |fact|
  if fact.is_real?
    passing_facts << fact
  else
    alternative_facts << fact
  end
end

alternative_facts.each do |bad_fact|
  passing_facts = passing_facts.reject {|good_fact| good_fact.speaker == bad_fact.speaker }
end

return passing_facts

您如何重新安排循环/测试,以便不必多次访问数据。

给定数据集的 passing_facts 多于 alternative_facts

最佳答案

您的前 8 行可以替换为 Enumerable#partition .

此代码在 @facts 上迭代一次,在 alternative_facts 上迭代一次,在 passing_facts 上迭代一次。它使用 Set 进行更快的查找:

require 'set'

passing_facts, alternative_facts = @facts.partition(&:real?)

bad_speakers = Set.new(alternative_facts.map(&:speakers))

passing_facts.reject! do |fact|
  bad_speakers.include? fact.speaker
end

return passing_facts

平均复杂度应该是 O(n),相比之下你的代码是 O(n**2)O(n*log(n )) 其他答案。

关于ruby - 优化这个ruby循环结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883873/

相关文章:

ruby-on-rails - 加载错误 : cannot load such file -- gemname/base

ruby - 获取加载时添加的内容

sql-server - 我如何批量读取用户名列表并在 sql 语句中使用这些用户名?

java - 在 Java 中对单个字符进行子字符串化

ruby-on-rails - Ruby PayPal SDK,从授权代码获取 token 信息抛出 400 错误

ruby-on-rails - rails 数据库 :seed "rake aborted! ArgumentError: wrong number of arguments (2 for 0..1)"

javascript - 在 Javascript 中迭代 Java 列表?

python - 将图像分割为像素(列)

R 循环并从 yahoo.com 下载股票价格

ruby-on-rails - 需要 'bundler/setup' 和 'Bundler.require' 做什么?