给定事实列表,测试事实 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/