Java-Code mit Tests - Endlosschleife?

Ich versuche, die Beziehung zwischen Menschen zu bekommen. Wenn ich jedoch einen Komponententest durchführe, wird der Test für immer ausgeführt, das Ergebnis wird nicht angezeigt und meine CPU-Auslastung war hoch. Könnte jemand sehen, was mit meinem Code nicht stimmt?

Die Zeichenkettenbeziehungen sind mehrzeilige Eingaben von Zeichenketten im Format von"A , B C , D" woherA ist das Elternteil vonB undC ist das Elternteil vonD.

Dies ist der Standardkonstruktor für den Code und die Eingabe im Zeichenfolgenformat. Wir müssen nicht überprüfen, ob das Format korrekt ist:

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

Dies ist die Hilfsfunktion, mit der jede Zeile der Zeichenfolge aus der formatierten Eingabe abgerufen wird:

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

Dies ist die Funktion, um alle Relationen aus der eingabeformatierten Zeichenfolge in Arraylisten zu setzen:

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

Dies ist die Methode, um zu überprüfen, ob der Eingabename existiert:

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

Dies ist die Funktion, um die Generationsnummer zwischen zwei Personen zu ermitteln:

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

Dies ist die Methode, um mehrere zu erhalten"great" für die endgültige Ausgabe:

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

Dies ist meine letzte Methode, um die Beziehung zwischen zwei Personen zu überprüfen:

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

Dies sind meine Testfälle. Sie werden für immer ausgeführt und können kein Ergebnis erzielen

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage