java - 找出循环错误

标签 java loops arraylist infinite-loop

所以我遇到了无限循环问题,但我根本无法找出它是什么/在哪里。 我有一个名为 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/

相关文章:

java - 拆分大的测试方法

java - 哪个是最好的 Java 隔离框架? JMock、Easymock、Mockito 或其他?

c - 查找排序数组中元素的索引,如果未找到,则打印应插入的位置的索引

java - 两个JTable共用滚动条

java - 使用 Java 驱动程序更新 MongoDB 中子字段的值?

ruby-on-rails - 防止未定义的链式方法

python - 如何在 python 中使用循环有效地进行特征工程?

java - 无限递归!如何转换?

C#:检查 ArrayList 元素是否具有特定类型

java - 将 ArrayLists 用于一组类的更有效方法?