这个项目的目的是制作一个pokedex,用于添加和保存用户输入传入的所有小精灵。当用户输入已存储在pokedex中的小宠物时,单词"复制"应该打印到控制台。即使在对象数组中没有实际的重复项,也会打印单词duplicate。这是控制台的输出:
欢迎来到您的新PokeDex! 你所在地区有多少神奇宝贝?:3
你的新Pokedex可以容纳3个口袋妖怪。让我们开始使用它!
你想做什么? 2
请输入宠物小精灵的物种:红色 重复
现在这里使用的所有代码都可能出现此错误
import java.util.Scanner;
public class Project4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Welcome to your new PokeDex!");
System.out.print("How many Pokemon are in your region?: ");
int size = input.nextInt();
Pokedex pokedex = new Pokedex(size);
System.out.println("\nYour new Pokedex can hold " + size + " Pokemon. Let's start using it!");
int choice = 0;
boolean done = false;
while (!done) {
System.out.println("\n1. List Pokemon\n2. Add Pokemon\n3. Check a Pokemon's Stats" + "\n4. Sort Pokemon\n5. Exit");
System.out.print("\nWhat would you like to do? ");
choice = input.nextInt();
switch (choice) {
case 1:
String[] pokemonList = pokedex.listPokemon();
if (pokemonList == null)
System.out.println("Empty");
else
for (int i = 0; i < pokemonList.length; i++) {
System.out.println((i + 1) + ". " + pokemonList[i]);
}
break;
case 2:
System.out.print("\nPlease enter the Pokemon's Species: ");
String species = input.next();
pokedex.addPokemon(species);
break;
}
}
}
}
在下面的类中,我有一个实际的方法,为Pokedex添加pokemon和构造函数
public class Pokedex {
Pokemon[] pokedex;
String pokeArray[];
public Pokedex(int size) {
pokedex = new Pokemon[size];
pokeArray = new String[size];
}
public boolean addPokemon(String species) {
Pokemon stuff = new Pokemon(species);
for (int i = 0; i < pokedex.length; i++) {
if (pokedex[i] == null) {
pokedex[i] = stuff;
}
else if (i < pokedex.length && pokedex[i] != null) {
System.out.println("Max");
}
if (pokedex[i].getSpecies().equalsIgnoreCase(species)) {
System.out.print("Duplicate");
break;
}
}
return false;
}
}
很抱歉我需要大量的代码来帮助跟踪这个意外结果的来源。
答案 0 :(得分:0)
它之所以这样做是因为这里有一些代码:
public boolean addPokemon(String species)
{
Pokemon stuff = new Pokemon(species);
for (int i = 0; i < pokedex.length; i++)
{
if (pokedex[i] == null)
pokedex[i] = stuff;
else if (i < pokedex.length && pokedex[i] !=null)
System.out.println("Max");
if(pokedex[i].getSpecies().equalsIgnoreCase(species))
{
System.out.print("Duplicate");
break;
}
}
return false;
}
问题只是缺少一点语法。在你的for循环中,你检查是否
A)阵列中有空位
B)如果阵列中的每个元素直到用户输入的大小都是满的
和C)如果数组中的任何元素与我们尝试添加的元素匹配。
您遇到的问题是因为您的C是if
而不是else if
。因为A看到索引为null,所以它将新的Pokemon分配给Pokedex。然后因为C是if而不是else if,它在你分配新的Pokemon之后运行,并看到我们刚刚添加的Pokemon,并说它是重复的。将其更改为else,如果可以解决此问题。
此外,由于A中没有break;
,它会将数组的每个元素分配给输入的第一个元素,从而导致任何进一步的添加调用Max。我编辑了代码,这就是我对我有用的东西:
public boolean addPokemon(String species)
{
Pokemon stuff = new Pokemon(species);
for (int i = 0; i < pokedex.length; i++)
{
if(pokedex[i] !=null && pokedex[i].getSpecies().equalsIgnoreCase(species))
{
System.out.println("Duplicate");
break;
}
else if (pokedex[i] == null)
{
pokedex[i] = stuff;
break;
}
else if(i + 1 == pokedex.length)
{
System.out.println("Max");
break;
}
}
return false;
}
另外,出于好奇,为什么addPokemon()函数是一个布尔值?您返回一个值(尽管是任意的)然后再也不对该值做任何事情。你可以把它变成一个空白,让它什么都不返回,它就可以正常工作了。