检测循环依赖关系

时间:2017-11-28 13:43:17

标签: java recursion breadth-first-search

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

我需要检测循环依赖关系(scenario1 - > scenario2 - > scenario3 - > scenario1)。

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

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

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

我是否在错误的时间添加/检查列表?

修改

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;
}

1 个答案:

答案 0 :(得分:0)

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

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;
}