订购具有依赖关系的列表的方法

时间:2013-08-09 14:05:20

标签: ruby-on-rails list methods

条件:必须使用基于Web的解决方案(HTML / CSS),必须使用Ruby on Rails,不使用数据库。

想象一下,我们有一个工作列表,每个工作由一个角色代表。因为某些工作必须先于其他工作完成,所以工作可能依赖于另一工作。例如,a可能依赖于b,意味着最终的作业序列应该在a之前放置b。如果a没有依赖关系,则最终序列中a的位置无关紧要。这些作业将通过一个简单的文本框输入(也是如何存储多个变量)

鉴于以下工作结构:

  • a =>
  • b =>
  • c =>

结果应该是一个包含所有三个作业abc的序列,没有重要的顺序。

鉴于以下工作结构:

  • a =>
  • b => ç
  • c => ˚F
  • d =>一个
  • e => B'/ LI>
  • f =>

结果应该是一个序列,它定位在c之前的c,c之前的b,b之前的e和一个包含所有六个作业abcdef之前的d。

鉴于以下工作结构:

  • a =>
  • b => ç
  • c => ˚F
  • d =>一个
  • e =>
  • f => B'/ LI>

结果应该是一个错误,指出作业不能具有循环依赖性。

1 个答案:

答案 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