2012-11-18 65 views
-1

可能重复:
Java code with tests - infinite loop?可能有的帮我看看为什么我的代码无法运行

这里是我的代码,我想人与人之间的关系,然而,当我运行单元测试,测试永远跑,不能得到的结果,我的CPU使用很高。 这是我的代码。有人可以看到它有什么问题吗? 字符串关系是串的多个线路输入用的格式“A,B” + \ n” + ‘C,d’,其中A为B和C的父D.

的父

这是在代码和默认构造函数是字符串的输入格式,我们并不需要检查,如果格式正确

  public SeeRelations(String relations){ 
       this.relations = relations; 
      } 

//辅助函数来得到字符串的每一行

private ArrayList<String> lineRelations(){ 
      int i; 
      ArrayList<String> lineRelations = new ArrayList<String>(); 
      String[] lines = relations.split("\n"); 
      for(i = 0; i < lines.length; i++){ 
       lineRelations.add(lines[i]); 
      } 
      return lineRelations; 
     } 

//帮助功能把每个在的ArrayList关系

 private ArrayList<ArrayList<String>> allRelations(){ 
       int i; 
       ArrayList<ArrayList<String>> allRelations = new ArrayList<ArrayList<String>>(); 
       ArrayList<String> lineRelations = lineRelations(); 
       for(i = 0; i < lineRelations.size(); i++){ 
        ArrayList<String> eachLine = new ArrayList<String>(Arrays.asList(lineRelations.get(i).split("\\s*,\\s*"))); 
        allRelations.add(eachLine); 
       } 
       return allRelations; 
      } 

这是检查输入的名字是存在 //辅助函数,看是否名seeRelations存在()

private boolean hasThisName(String name){ 
     ArrayList<ArrayList<String>> allRelations = allRelations(); 
     int i; 
     int j; 
     for(i = 0; i < allRelations.size(); i++){ 
      for(j = 0; j < allRelations.get(i).size(); j++){ 
       if(name.equals(allRelations.get(i).get(j))){ 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

这是获得功能的方法两个人 //辅助函数之间的世代数得到seeRelations的世代号()

 private int getGenerationNum(String person, String ancestor){ 
     ArrayList<ArrayList<String>> allRelations = allRelations(); 
     String name; 
     int i; 
     int j; 
     int generationNum = 0; 
     for(i = 0, j = 0, name = ancestor; i < allRelations.size(); i++){ 
      if(name.equals(allRelations.get(i).get(0)) && !person.equals(allRelations.get(i).get(1))){ 
       generationNum++; 
       ancestor = allRelations.get(i).get(1); 
       i = 0; 
       j = 1; 
      } 
      else if(ancestor.equals(allRelations.get(i).get(0)) && person.equals(allRelations.get(i).get(1))){ 
       generationNum++; 
       j = 1; 
       break; 
      } 
     } 
     if(j == 0){ 
      return 0; 
     } 
     else{ 
      return generationNum; 
     } 
    } 

这是满足霍德获得的“伟大”多为最终输出

private String great(int num){ 
     int i; 
     String great = ""; 
     for(i = 0; i < num; i++){ 
      great += "great"; 
     } 
     return great; 
    } 

这是我检查两个人

public String seeRelations(String person, String ancestor){ 
     int generationNum = getGenerationNum(person, ancestor); 
     String great = great(generationNum - 2); 
     if(!(hasThisName(person) && hasThisName(ancestor))){ 
      return null; 
     } 
     else{ 
      if(generationNum == 0){ 
       return null; 
      } 
      else if(generationNum == 1){ 
       return ancestor + " is the parent of " + person; 
      } 
      else if(generationNum == 2){ 
       return ancestor + " is the grandparent of " + person; 
      } 
      else{ 
       return ancestor + " is the" + " " + great +"grandparent of " + person; 
      } 
     } 
    } 
+0

for input string format is a multiple line string I made a typo in the explanation above – user1834274

+0

correct format is“A,B”+“\ n”+“C,D”,其中A是B的父亲,C是d – user1834274

+0

的父母,你可以添加一些'的System.out.println()'你的代码输出的方法名称和方法PARAMS和看控制台上看到你的代码是挂。或者,使用java调试器浏览代码以观察发生了什么。 –

回答

1

这段代码看起来可疑我之间的关系最终方法。它在一个循环内,取决于递增i时的终止,但有条件地将i重置为零。什么保证我会过去1?

 if(name.equals(allRelations.get(i).get(0)) && !person.equals(allRelations.get(i).get(1))){ 
      generationNum++; 
      ancestor = allRelations.get(i).get(1); 
      i = 0; 
      j = 1; 
     } 

一般情况下,我建议简化您的代码,直到它的工作原理,然后逐渐增加,这样你只需要在一个时间来调试一小段代码。

+0

没有我检查了好几次,但似乎不是我的无限循环至少 – user1834274

+0

在这种情况下,我再次剥离下来,直到你有,它运行的东西的建议,然后逐渐建立测试所有的时间。 –

相关问题