检测循环依赖

Detecting Circular Dependencies

给定 "Scenarios" 的依赖关系树,我正在计算每个场景分支的 "weight"。

我需要检测循环依赖(场景 1 -> 场景 2 -> 场景 3 -> 场景 1)。

我目前正在进行广度优先搜索并在递归链中传递一个列表,但是我无法检测到循环依赖。

每次迭代我都会将当前场景(字符串)添加到 List,然后检查 dependsOnScenarios(场景名称数组)。

我应该只是检查一个字符串是否包含在字符串列表中,但这种情况永远不会捕获它。

我是否在错误的时间添加了 to/checking 列表?

编辑:

allScenarios 是:一个ConcurrentHashMap<String, Scenario>

dependsOnScenariosString[]Scenario

的 属性

name 是一个字符串和 Scenario

的 属性

getWeight 最初使用空列表调用:

s.priority = getWeight(s, new ArrayList<String>())+1;

输入:

Scenario g1=new Scenario("Scenario1" , null);
Scenario g2=new Scenario("Scenario2" , new String[]{"Scenario4"});
Scenario g3=new Scenario("Scenario3" , new String[]{"Scenario1","Scenario2"});
Scenario g4=new Scenario("Scenario4" , new String[]{"Scenario3"});

代码:

private static int getWeight(Scenario scenario, List<String> visited) throws Exception{
  int numDep = 0;         
  visited.add(scenario.name);  
  if(scenario.dependsOnScenarios != null){          
      for(String dependency:scenario.dependsOnScenarios) {
           if(visited.contains(dependency)){
                 throw new Exception("Circular Reference: "+dependency+" has already occured");
           }
           return scenario.dependsOnScenarios.length + getWeight(allScenarios.get(dependency),visited);
      }
  }
  return numDep;
}

我的问题是我在评估和检查整个列表之前就从循环中返回了。我需要使用额外的循环来全面检查所有内容。

private static int getWeight(Scenario scenario, List<String> visited) throws Exception{
  int numDep = 0;
  visited.add(scenario.name);
  if(scenario.dependsOnScenarios != null){
      for(String dependency:scenario.dependsOnScenarios) {
          if(visited.contains(dependency)){
             throw new Exception("Circular Reference: "+String.join("->",visited)+"->"+dependency);
          }
      }
      for(String dependency:scenario.dependsOnScenarios) {              
          return scenario.dependsOnScenarios.length + getWeight(allScenarios.get(dependency),visited);
      }
  }
  return numDep;
}