0

人と人との関係を手に入れようとします。ただし、単体テストを実行すると、テストが永遠に実行され、結果が得られず、CPU 使用率が高くなりました。誰かが私のコードの何が問題なのかを知ることができますか?

文字列リレーションは、文字列の複数行の入力で"A , B C , D"Aは の親でBあり、Cはの親です の形式ですD

これは、コードと文字列形式の入力の既定のコンストラクターです。形式が正しいかどうかを確認する必要はありません。

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

これは、フォーマットされた入力から文字列の各行を取得するヘルパー関数です。

//helper function to get each line of the string
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;
}

これは、入力フォーマットされた文字列から配列リストへのすべての関係を配置する関数です。

//helper function to put each of the relationship in 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;
}

これは、入力名が存在するかどうかを確認する方法です。

//helper function to see if the name exist for 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 人の間の世代番号を取得する関数です。

//helper function to get Generation number of 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;
    }
}

"great"これは、最終出力の倍数を取得する方法です。

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

これは、2 人の関係を確認する最後の方法です。

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

これは私のテストケースです。永遠に実行され、結果を得ることができませんでした

public class FamilyTreeTest {

    @Test
    public void testSeeRelations() {
        FamilyTree relation2 = new FamilyTree("John Doe ,   Mary Smith" + "\n" + "Martin Weasel ,  John Doe");
        assertEquals("Martin Weasel is the grandparent of Mary Smith", familyTree2.SeeRelations("Mary Smith", "Martin Weasel"));
    }
4

1 に答える 1

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

ここにあなたの場合、あなたの先祖/名前は "Martin Weasel" で、Martin の関係は "John Doe" ですが、mary smith を探しているので、 name.equals(allRelations.get(i).get(0)) && !person.equals(allRelations.get(i).get(1)))これがループの最初から始まりますtruei = 0;

あなたができることは、オブジェクトの人物を作成してみてください。つまり、クラスの人物{文字列名; 子を一覧表示します。親をリストします。... } 次に、単純なツリー ウォーカーを実行します。

int SearchDown(Person person, String searchedRelation,int generation)
{
if person.getName().equals(searchedRelation())
return generation;
for (Person child: person.getChildren())
{
int generation = SearchDown(child, searchedRelation, generation+1);
if (generation!=-1) return generation;
}
return -1;
}

等...

私は本当にこの方法であらゆる種類の木を扱うのがずっと簡単だと思っています

于 2012-11-19T10:09:20.987 に答える