条件:必须使用基于Web的解决方案(HTML / CSS),必须使用Ruby on Rails,不使用数据库。
想象一下,我们有一个工作列表,每个工作由一个角色代表。因为某些工作必须先于其他工作完成,所以工作可能依赖于另一工作。例如,a可能依赖于b,意味着最终的作业序列应该在a之前放置b。如果a没有依赖关系,则最终序列中a的位置无关紧要。这些作业将通过一个简单的文本框输入(也是如何存储多个变量)
鉴于以下工作结构:
结果应该是一个包含所有三个作业abc的序列,没有重要的顺序。
鉴于以下工作结构:
结果应该是一个序列,它定位在c之前的c,c之前的b,b之前的e和一个包含所有六个作业abcdef之前的d。
鉴于以下工作结构:
结果应该是一个错误,指出作业不能具有循环依赖性。
答案 0 :(得分:0)
这应该有效:
module JobDependenciesResolver
def self.organize(dependencies)
unresolved_dependencies = dependencies.dup
sorted_jobs = []
until unresolved_dependencies.empty? do
doable_jobs = get_doable_jobs unresolved_dependencies, sorted_jobs
raise Exception.new("Not able to resolve dependencies") if doable_jobs.empty?
sorted_jobs += doable_jobs
unresolved_dependencies.delete_if {|key,value| sorted_jobs.include? key}
end
sorted_jobs
end
private
def self.get_doable_jobs(dependencies, job_array)
dependencies.select {|job, dependency| ([*dependency]-job_array).empty? }.keys
end
end