给定" Scenarios"的依赖关系树,我计算"权重"每个场景分支。
我需要检测循环依赖关系(scenario1 - > scenario2 - > scenario3 - > scenario1)。
我目前正在进行广度优先搜索并在递归链中传递列表,但是我无法检测到循环依赖。
每次迭代我将当前场景(String)添加到List
,然后检查dependsOnScenarios
(场景名称数组)。
我应该只是检查一个字符串是否包含在字符串列表中,但这种情况永远不会捕获它。
我是否在错误的时间添加/检查列表?
修改
allScenarios
是:ConcurrentHashMap<String, Scenario>
dependsOnScenarios
是String[]
,属性为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;
}
答案 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;
}