重複の可能性:
テスト付きの 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;
}
}
}