所以我遇到了无限循环问题,但我根本无法找出它是什么/在哪里。
我有一个名为 dailyPlanetStreet
的 arrayList ,其中填充了任一类的对象
Goodguy Badguy Person 或 NormalGuy。在我下面的删除机制中,如果坏人的一侧有一个正常人/人,我会删除那个人/正常人。
如果双方都有正常人/人,我会随机删除其中一个。还,
每次我删除一个时,我都会随机地将另一个人/普通人从 dailyplanetstreet 移动到另一个称为安全地的数组列表。
这是我当前的输出:
normal guy
normal guy
person
badguy
normal guy
goodguy
normal guy
person
person
person
yo
normal guy
normal guy
person
badguy
goodguy
normal guy
person
person
person
代码:
import java.util.ArrayList;
public class GothamLikeAdventureTown
{
static int y=5;
static int x=3;
static ArrayList<Person> dailyPlanetStreet=new ArrayList<Person>();
static ArrayList<Person> safetyLand=new ArrayList<Person>();
static ArrayList<Person> unfortunatelyFatallyWoundedPeople=new ArrayList<Person>();
public static void rescue() {
int goodpos=0;
int randompos=(int)(Math.random()*dailyPlanetStreet.size());
for (int counter1=0; counter1<dailyPlanetStreet.size(); counter1++){
if (dailyPlanetStreet.get(counter1).name()!="Kent Clark") {counter1=goodpos;}
}
dailyPlanetStreet.add(randompos,dailyPlanetStreet.remove(goodpos));
}
public static void tosafety() {
int outer=12;
while (outer!=12){
int randompos=(int)(Math.random()*dailyPlanetStreet.size());
if ((dailyPlanetStreet.get(randompos).name()!="Clark Kent") && (dailyPlanetStreet.get(randompos).name()!="James Kalvin"))
{
safetyLand.add(dailyPlanetStreet.remove(randompos));
outer=12;
} }
}
public static void remove(int deletepos) {
unfortunatelyFatallyWoundedPeople.add(dailyPlanetStreet.remove(deletepos));
}
public static void display(){
System.out.println();
System.out.println();
for (int z=0; z<dailyPlanetStreet.size(); z++)
{
if (dailyPlanetStreet.get(z) instanceof BadGuy) System.out.println("badguy");
else if (dailyPlanetStreet.get(z) instanceof GoodGuy) System.out.println("goodguy");
else if (dailyPlanetStreet.get(z) instanceof NormalGuy) System.out.println("normal guy");
else if (dailyPlanetStreet.get(z) instanceof Person) System.out.println("person");
}
}
public static void main(String args[])
//code for putting in value of arraylist....
display();
while (dailyPlanetStreet.size()>2){
for (int counter=0; counter<dailyPlanetStreet.size(); counter++){
if (dailyPlanetStreet.get(counter).name()=="James Kalvin")
{
if ((counter==0) && (dailyPlanetStreet.get(1).name()=="Clark Kent")) {}
else if ((counter==0) && (dailyPlanetStreet.get(1).name()!="Clark Kent")) {System.out.println("yo"); remove(counter+1);display();rescue();}
else if ((counter==dailyPlanetStreet.size()-1) && (dailyPlanetStreet.get(dailyPlanetStreet.size()-2).name()=="Clark Kent")) {System.out.println("yo");display(); tosafety();rescue();}
else if ((counter==dailyPlanetStreet.size()-1) && (dailyPlanetStreet.get(dailyPlanetStreet.size()-2).name()!="Clark Kent")) {System.out.println("yo");remove(counter-1);display();tosafety();rescue();}
else if (dailyPlanetStreet.get(counter+1).name()=="Clark Kent") {System.out.println("yo");remove(counter-1);display();tosafety();rescue();}
else if (dailyPlanetStreet.get(counter-1).name()=="Clark Kent") {System.out.println("yo");remove(counter+1);display(); tosafety();rescue();}
else if ((dailyPlanetStreet.get(counter-1).name()!="Clark Kent")&& (dailyPlanetStreet.get(counter+1).name()!="Clark Kent"))
{
if (((int)(Math.random()*2))==1) {System.out.println("yo");remove(counter+1); display();tosafety();rescue();}
else {System.out.println("yo");remove(counter-1); display(); tosafety();rescue();}
}
}
}
System.out.println(dailyPlanetStreet.size());
}
System.out.println("hi");
}
}
最佳答案
我看到的一个问题是您有以下方法:
public static void rescue() {
int goodpos=0;
int randompos=(int)(Math.random()*dailyPlanetStreet.size());
for (int counter1=0; counter1<dailyPlanetStreet.size(); counter1++){
if (dailyPlanetStreet.get(counter1).name()!="Kent Clark") {counter1=goodpos;}
}
dailyPlanetStreet.add(randompos,dailyPlanetStreet.remove(goodpos));
}
在上面,每次名称不是“Kent Clark”时,您都会将 counter1
设置回零。您可能打算在 if
子句中使用 goodpos = counter1;
。另外,不要使用 ==
或 !=
来比较 String
值,而应使用 .equals()
。
因此上面应该是:
public static void rescue() {
int goodPos = 0;
int randomPos = (int)(Math.random() * dailyPlanetStreet.size());
for (int counter1 = 0; counter1 < dailyPlanetStreet.size(); counter1++) {
if (!"Kent Clark".equals(dailyPlanetStreet.get(counter1).name())) {
goodPos = counter1;
}
}
dailyPlanetStreet.add(randomPos, dailyPlanetStreet.remove(goodPos));
}
这会找到街上最后一个非超人,并将其移动到随机位置。如果你想找到第一个,你应该使用 break
跳出循环。
此外,由于您不断检查对象的名称是否为 Clark Kent,因此请使用辅助方法来 DRY(不要重复自己)代码并提高可读性:
private boolean isClarkKent(Person person) {
return "Kent Clark".equals(person.getName());
}
关于java - 找出循环错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20416018/