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