【问题标题】:could some help me find why my code couldn't run [duplicate]有人可以帮我找出为什么我的代码无法运行[重复]
【发布时间】:2012-11-18 22:15:37
【问题描述】:

可能重复:
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;
        }

//帮助函数将每个关系放入arraylists

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

【问题讨论】:

  • 输入字符串格式是多行字符串我在上面的解释中打错了
  • 正确的格式是"A , B" + "\n" + "C , D",其中A是B的父级,C是D的父级
  • 您可以在代码中添加一些System.out.println() 以输出方法名称和方法参数并观察控制台以查看您的代码挂在哪里。或者,使用 java 调试器单步执行代码以观察发生了什么。

标签: 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;
        }

一般来说,我建议简化你的代码直到它可以工作,然后逐渐添加,这样你一次只需要调试一小段代码。

【讨论】:

  • 不,我检查了几次,但至少对我来说似乎不是无限循环
  • 在这种情况下,我重申我的建议,即剥离它直到你有可以运行的东西,然后一直逐步建立测试。
猜你喜欢
  • 2021-10-18
  • 2017-11-28
  • 2021-07-30
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
相关资源
最近更新 更多