如何删除数组中与同一数组中另一个对象同名的对象?

How do i delete an object in an array which has a same name as another object in that same array?

我正在 Java 中编写一个简单有趣的项目,创建一个循环,该循环在数组列表中创建一个名称为 Random(1-60)(例如 Dog2、Dog6)的对象 59 次。

而这个循环,将检查它刚刚创建的对象是否与同一数组列表中的另一个对象同名,并删除它刚刚创建的对象。

基本上,它会删除一个具有克隆名称的对象。

但是我不知道怎么办。

我已经试过了,但是……没用。

public class main {

  public static void main(String[] args) {
  ArrayList<Animal> Pets = new ArrayList<Animal>();
  Random rand = new Random();
    int ha = rand.nextInt(59)+1;
    for (int i = 0; i <= 59; i++) {
      Pets.add(new Dog("Dog"+ha, 4));
      //Clone name object detector,
      if (Pets.size() > 0+1) {
        if (Pets.get(i).name == Pets.get(i-1).name) {
        Pets.remove(i);
} // and deleter
}
      Pets.get(i).makeSound();
      ha = rand.nextInt(59)+1;
      
}
  }
}

具有克隆名称的对象仍然存在。我知道那行不通,因为 i-1 很小。

Dog4 barks.
Dog16 barks.
Dog11 barks.
Dog37 barks.
Dog25 barks.
Dog35 barks.
Dog40 barks.
Dog30 barks.
Dog14 barks.
Dog44 barks.
Dog4 barks.
Dog21 barks.
Dog37 barks.
Dog51 barks.
Dog20 barks.
Dog30 barks.
Dog32 barks.
Dog25 barks.
Dog26 barks.
Dog41 barks.
Dog20 barks.
Dog37 barks.
Dog23 barks.
Dog48 barks.
Dog49 barks.
Dog8 barks.
Dog7 barks.
Dog40 barks. --
Dog34 barks.
Dog29 barks.
Dog8 barks.
Dog52 barks.
Dog9 barks.
Dog27 barks.
Dog31 barks.
Dog46 barks.
Dog19 barks.
Dog46 barks.
Dog25 barks.
Dog33 barks.
Dog38 barks.
Dog9 barks.
Dog40 barks.--
Dog56 barks.
Dog18 barks.
Dog51 barks.
Dog17 barks.
Dog22 barks.
Dog6 barks.
Dog40 barks. --
Dog47 barks.
Dog23 barks.
Dog10 barks.
Dog23 barks.
Dog20 barks.
Dog13 barks.
Dog33 barks.
Dog35 barks.
Dog18 barks.
Dog17 barks.

所以我需要帮助,我该怎么做?

您可以为新创建的狗创建临时 object,然后再将其添加到您的列表中。然后你检查是否已经存在具有该名称的动物,如果它不存在,你将它添加到你的 collection 并让他发出声音。如果它已经存在,您可以创建另一个 OR(就像我在给定的示例中所做的那样),只需将该动物添加到您的列表中即可。

如果您 remove/skip 添加元素,使用迭代器 i 也是有风险的,因为它会变得比列表中的最大索引更大,并且您可能会遇到 IndexOutOfBoundsException

public class Main {
    public static void main(String[] args) {
        List<Animal> pets = new ArrayList<>();
        Random rand = new Random();
        int ha = rand.nextInt(59) + 1;
        for (int i = 0; i <= 59; i++) {
            //we create new temp object with new name
            Animal tempAnimal = new Dog("Dog " + ha);
            //we can if object with that name already exists in our list
            if (!pets.contains(tempAnimal)) {
                pets.add(tempAnimal);
                pets.get(pets.size()-1).makeSound();
            }
            ha = rand.nextInt(59) + 1;
        }
    }
}

有几个问题:

  • 将字符串与 .equals()
  • 进行比较
  • rand.nextInt(59) + 1; returns [1-59]
  • 范围内的数字
  • 当您不添加时,i 仍然递增,因此添加的项目少于 60 个

您可以使用 while 循环:

ArrayList<Animal> Pets = new ArrayList<Animal>();
Random rand = new Random();
while (Pets.size() < 60) {
    int ha = rand.nextInt(60) + 1;
    Dog d = new Dog("Dog" + ha, 4);
    if (!Pets.contains(d)) {
        Pets.add(d);
        d.makeSound();
    }
}

另一种选择是制作一个顺序列表,然后将其打乱:

for (int i = 1; i <= 60; i++) {
    Pets.add(new Dog("Dog" + i, 4));
}
Collections.shuffle(Pets);
for (Animal a : Pets) {
    a.makeSound();
}

如果您使用 contains()(如第一个示例),请不要忘记在 Animal class:

中覆盖 equals()
class Animal
{
    // Other Animal stuff.....

    @Override
    public boolean equals(Object obj) {
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        return name.equals(((Animal)obj).name);
    }
}

否则,您必须手动检查列表:

ArrayList<Animal> Pets = new ArrayList<Animal>();
Random rand = new Random();
while (Pets.size() < 60) {
    int ha = rand.nextInt(60) + 1;
    Dog d = new Dog("Dog" + ha, 4);
    boolean found = false;
    for (Animal a : Pets) {
        if (a.name.equals(d.name)) {
            found = true;
            break;
        }
    }
    if (!found) {
        Pets.add(d);
        d.makeSound();
    }
}