Código Java con pruebas - ¿bucle infinito?

Intento conseguir la relación entre las personas. Sin embargo, cuando ejecuto la prueba de unidad, la prueba se ejecuta para siempre, no obtiene el resultado y mi uso de CPU fue alto. ¿Podría alguien ver lo que está mal con mi código?

Las relaciones de cadena son múltiples entradas de línea de cadena con en el formato de"A , B C , D" dóndeA es el padre deB yC es el padre deD.

Este es el constructor predeterminado para el código y la entrada en formato de cadena. No necesitamos verificar si el formato es correcto:

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

Esta es la función auxiliar para obtener cada línea de la cadena de la entrada formateada:

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

Esta es la función para poner todas las relaciones de la cadena formateada de entrada a los arraylists:

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

Este es el método para verificar si el nombre de entrada existe:

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

Esta es la función para obtener el número de generación entre dos personas:

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

Este es el método para obtener múltiples de"great" para la salida final:

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

Este es mi último método para verificar la relación entre dos personas:

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

Este es mi caso de prueba, y se ejecuta para siempre y no pudo obtener un resultado

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta