Java 如果没有 println() 语句,循环将无法工作
Java loop won't work without println() statement
我目前正在参加 Java 的初级编程课程。我有一个函数,应该从 pokemon 列表中随机 select 两个随机不同的 pokemon。起初,代码不起作用,只是无限地重复执行 while 循环。我添加了一个用于调试的 println 语句,突然间该功能完美运行。
该函数如下所示:
public boolean addRandomPokemon()
{
boolean runCheck = true;
boolean canUse = true;
while (runCheck)
{
int rand = Randomizer.nextInt(3);
for (int i = 0; i < pokeDeck.size(); i++)
{
System.out.println();
if(pokeDeck.get(i).getName().equals(POKEMON_NAMES[rand]))
{
canUse = false;
}
}
if (canUse)
{
Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
pokeDeck.add(poke);
runCheck = false;
}
}
return true;
}
其中整数rand为随机整数(0,3)。谁能解释为什么会这样,并为这个问题提供更好的解决方案。简单的解释是首选,因为我在编程方面不是很有经验。
谢谢!
当你的 pokeDeck 至少有一个元素,如果你满足 if 条件,你将 canUse 布尔值设置为 false,这样你就不会再进入第二个 if
if (canUse)
{
Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
pokeDeck.add(poke);
runCheck = false;
}
因此您的 runCheck 布尔值始终为真,因此循环是无限的。
您可以修复此行为,添加如下 else 语句:
if (canUse)
{
Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
pokeDeck.add(poke);
runCheck = false;
} else {
canUse = true;
}
所以你还有机会在下一个循环中退出你的循环。
println
在你的无限循环中没有效果
我认为 System.out.println() 对您的问题没有影响。该语句只是将任何值打印到控制台。还要确保你的 pokeDeck 在你的 POKEMON_NAMES 数组中不包含任何宠物小精灵,因为它将 canUse 更改为 false 然后你的 runCheck 将始终保持为真。
安排的代码:
public boolean addRandomPokemon()
{
boolean runCheck= true;
boolean status= false; // If we could insert a pokemon it will be true
ArrayList<Integer> index= new ArrayList<>();
for(int i=0; i<POKEMON_NAMES.length; i++) index.add(i); //We create the index pool for selection.
Random rand= new Random(System.currentTimeMillis()); // Current times seed for Random
while (index.size()>0 && runCheck)
{
int x= rand.nextInt(index.size());
int randPoke= index.remove(x);
for (int i = 0; i < pokeDeck.size(); i++)
{
if(pokeDeck.get(i).getName().equals(POKEMON_NAMES[randPoke]))
{
break;
}
Pokemon poke = new Pokemon(POKEMON_NAMES[randPoke]);
pokeDeck.add(poke);
runCheck = false;
status= true;
}
}
return status;
}
我目前正在参加 Java 的初级编程课程。我有一个函数,应该从 pokemon 列表中随机 select 两个随机不同的 pokemon。起初,代码不起作用,只是无限地重复执行 while 循环。我添加了一个用于调试的 println 语句,突然间该功能完美运行。 该函数如下所示:
public boolean addRandomPokemon()
{
boolean runCheck = true;
boolean canUse = true;
while (runCheck)
{
int rand = Randomizer.nextInt(3);
for (int i = 0; i < pokeDeck.size(); i++)
{
System.out.println();
if(pokeDeck.get(i).getName().equals(POKEMON_NAMES[rand]))
{
canUse = false;
}
}
if (canUse)
{
Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
pokeDeck.add(poke);
runCheck = false;
}
}
return true;
}
其中整数rand为随机整数(0,3)。谁能解释为什么会这样,并为这个问题提供更好的解决方案。简单的解释是首选,因为我在编程方面不是很有经验。 谢谢!
当你的 pokeDeck 至少有一个元素,如果你满足 if 条件,你将 canUse 布尔值设置为 false,这样你就不会再进入第二个 if
if (canUse)
{
Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
pokeDeck.add(poke);
runCheck = false;
}
因此您的 runCheck 布尔值始终为真,因此循环是无限的。
您可以修复此行为,添加如下 else 语句:
if (canUse)
{
Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
pokeDeck.add(poke);
runCheck = false;
} else {
canUse = true;
}
所以你还有机会在下一个循环中退出你的循环。
println
在你的无限循环中没有效果
我认为 System.out.println() 对您的问题没有影响。该语句只是将任何值打印到控制台。还要确保你的 pokeDeck 在你的 POKEMON_NAMES 数组中不包含任何宠物小精灵,因为它将 canUse 更改为 false 然后你的 runCheck 将始终保持为真。
安排的代码:
public boolean addRandomPokemon()
{
boolean runCheck= true;
boolean status= false; // If we could insert a pokemon it will be true
ArrayList<Integer> index= new ArrayList<>();
for(int i=0; i<POKEMON_NAMES.length; i++) index.add(i); //We create the index pool for selection.
Random rand= new Random(System.currentTimeMillis()); // Current times seed for Random
while (index.size()>0 && runCheck)
{
int x= rand.nextInt(index.size());
int randPoke= index.remove(x);
for (int i = 0; i < pokeDeck.size(); i++)
{
if(pokeDeck.get(i).getName().equals(POKEMON_NAMES[randPoke]))
{
break;
}
Pokemon poke = new Pokemon(POKEMON_NAMES[randPoke]);
pokeDeck.add(poke);
runCheck = false;
status= true;
}
}
return status;
}