在对象数组中查找重复项

时间:2016-12-11 22:11:34

标签: java arrays

这个项目的目的是制作一个pokedex,用于添加和保存用户输入传入的所有小精灵。当用户输入已存储在pokedex中的小宠物时,单词"复制"应该打印到控制台。即使在对象数组中没有实际的重复项,也会打印单词duplicate。这是控制台的输出:

欢迎来到您的新PokeDex! 你所在地区有多少神奇宝贝?:3

你的新Pokedex可以容纳3个口袋妖怪。让我们开始使用它!

  1. 列出宠物小精灵
  2. 添加口袋妖怪
  3. 查看宠物小精灵的统计资料
  4. 排序口袋妖怪
  5. 退出
  6. 你想做什么? 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;
        }
    } 
    

    很抱歉我需要大量的代码来帮助跟踪这个意外结果的来源。

1 个答案:

答案 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()函数是一个布尔值?您返回一个值(尽管是任意的)然后再也不对该值做任何事情。你可以把它变成一个空白,让它什么都不返回,它就可以正常工作了。