从Arraylist中删除对象如果它等于userinput,则只打印一次

时间:2017-12-11 16:22:00

标签: java for-loop arraylist remove-if

我现在一直在尝试大多数事情,但它似乎并没有起作用。如果用户输入特定名称,我想从Arraylist中删除特定对象。如果不是,我希望程序打印"找不到狗"。我在我的另一个类中有一个getName和toString方法,它与我在此程序中的所有其他选项一起使用,这是唯一不起作用的方法。

案例4是应该进行删除的地方。但我也希望你看一下案例3来比较案例3打印出来"无法找到狗"无论如何,案例4打印出来"无法找到狗"和对象一样多次。

这是主要方法:

ArrayList<Dog> doglist = new ArrayList<Dog>();
Scanner myscan = new Scanner(System.in);
boolean running = true;

while (running) {
    System.out.println("\n************************************");
    System.out.println("\nVälkommen till Kennelklubben!");
    System.out.println("\n************************************");
    System.out.println("\n[1] Register new dog");
    System.out.println("[2] Print out list");
    System.out.println("[3] Increase age");
    System.out.println("[4] Remove dog");
    System.out.println("[5] Quit program");
    System.out.println("\n************************************");
    System.out.println("\nChoose: ");

    int option = myscan.nextInt();

    switch (option) {
        case 1:
            System.out.println("Write name:");
            String name = myscan.next();
            System.out.println("Write race:");
            String race = myscan.next();
            System.out.println("Age:");
            int age = myscan.nextInt();
            System.out.println("Weight:");
            double weight = myscan.nextDouble();

            Dog dog = new Dog(name, race, age, weight);

            doglist.add(dog);

            break;
        case 2:
            System.out.println("Minimum length of tail:");
            double userInput1 = myscan.nextDouble();

            for (Dog d : doglist) {
                if (d.getTailLength() >= userInput1) {
                    System.out.println(d.toString());
                } else {
                    System.out.println("Can't find dog");
                }
            }
            break;
        case 3:
            System.out.println("Name of dog:");
            String userInput2 = myscan.next();

            for (Dog d : doglist) {
                if (d.getName().equals(userInput2)) {
                    d.increaseAge();
                    break;
                }
            }
            System.out.println("Can't find dog");
            break;
        case 4:
            System.out.println("Name of dog:");
            String userInput3 = myscan.next();
            for (Dog d : doglist) {
                if (d.getName().equals(userInput3)) {
                    doglist.remove(d.toString());
                } else {
                    System.out.println("Can't find dog");
                }
            }
            break;
        case 5:
            running = false;//Avslutar loopen och därmed programmet
            System.out.println("Programmet avslutat");
            break;
        default:
            System.out.println("Nu blev det fel, välj mellan [1] [2] [3] [4] [5]");//Felmeddelande om valet är någon annan siffra än de som menyn innehåller
            break;
    }
}

这是我的方法的另一个类

public class Dog
{
    private String name;
    private String race;
    private int age;
    private double weight;
    private double tailLength;

    public Dog (String name, String race, int age, double weight)
    {
        this.name = name;
        this.setRace(race);
        this.age = age;
        this.weight = weight;

        if(race.equals("tax"))
        {
            this.setTailLength(3.7);
        }
        else
        {
            this.setTailLength((age - weight) / 10);
        }
    }


    public String getRace()
    {
        return race;
    }

    public void setRace(String race)
    {
        this.race = race;
    }

    public double getTailLength()
    {
        return tailLength;
    }

    public void setTailLength(double tailLength)
    {
        this.tailLength = tailLength;
    }

    public int increaseAge()
    {
        age++;
        return age;
    }

    public String toString()
    {
        return name + " " + getRace() +
                " " + age + " " + "år" + " " + weight + " " + "kg" + " " + getTailLength();
    }

    public String getName()
    {
        return name;
    }
}

3 个答案:

答案 0 :(得分:2)

为了清楚起见,这是你现在所拥有的:

            System.out.println("Name of dog:");
            String userInput3 = myscan.next();

            for(Dog d : doglist) 
            {
                if(d.getName().equals(userInput3)) 
                {
                    doglist.remove(d.toString());
                }
                else
                {
                    System.out.println("Can't find dog");
                }
            }

            break;

dogListArrayList<Dog>

ArrayList.remove()的{​​{3}}:

  

从此列表中删除指定元素的第一个匹配项(如果存在)。如果列表不包含该元素,则不会更改。

在这里,您使用参数remove()呼叫d.toString()d是您要删除的Dog的实例。 d.toString()会返回String

因此dogList.remove(d.toString())会尝试从列表中删除String。显然,String不在列表中,因为它是Dog的列表。找不到String,也不会删除任何内容。

正如文档所说,您需要传递要删除的实例。您需要致电doglist.remove(d)。但是,这会导致错误,因为在迭代时无法从列表中删除项目。

因此,您需要将Dog实例存储在临时变量中,并在迭代后将其删除。

这样的事情会起作用:

Dog dogToRemove = null;
for (Dog d: dogList) {
    if (d.getName().equals(userInput3)) {
        dogToRemove = d;
    }
}

if (dogToRemove == null) {
    System.out.println("Could not find dog with name " + userInput3);
} else {
    dogList.remove(dogToRemove);
}

请注意,还有其他方法可以执行此操作,这只是其中之一。我鼓励您找到替代方案,以便了解其效果如何。

答案 1 :(得分:1)

案例3:

  • 尝试添加其他内容并在其中添加消息

            System.out.println("Name of dog:");
            String userInput2 = myscan.next();
    
            for (Dog d : doglist) {
                if (d.getName().equals(userInput2)) {
                    d.increaseAge();
                    break;
                }
                else {
                    System.out.println("Can't find dog");
                }
            }
    
            break;
    

对于案例4:您可以按索引删除

System.out.println("Name of dog:");
            String userInput3 = myscan.next();
            for (Dog d : doglist) {
                if (d.getName().equals(userInput3)) {
                    doglist.remove(doglist.indexOf(d));
                } else {
                    System.out.println("Can't find dog");
                }
            }
            break;

答案 2 :(得分:1)

使用Java 8可以有更好的方法。

doglist = doglist.stream().filter(dog -> !dog.getName().equals(userInput3)).collect(toList());

一行代码,易读,无移动部件

如果你没有找到狗,如果你想要一条消息,那么:

if (doglist.stream().anyMatch(dog -> dog.getName().equals(userInput3)){
  doglist = doglist.stream().filter(dog -> !dog.getName().equals(userInput3)).collect(toList());
} else {
   System.out.println("Can't find dog");
}