-1

重複の可能性:
テスト付きの Java コード - 無限ループ?

これは人の関係を取得したい私のコードですが、単体テストを実行すると、テストが永遠に実行されて結果が得られず、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;
        }

//各関係を配列リストに入れるヘルパー関数

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

これは2人の間の世代番号を取得する関数です //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;
            }
        }
    }
4

1 に答える 1