【问题标题】:Java ArrayList Create, edit and deleteJava ArrayList 创建、编辑和删除
【发布时间】:2012-02-01 14:11:29
【问题描述】:

我试图在同一个循环中使用不同的方法从对象集合的数组列表中添加和删除,我的问题是在添加和删除之后我尝试打印我的数组列表但我无法获得添加的值最近。我正在使用 ListIterator 添加和使用 Iterator 删除,因为我在一堆网站中读到这是添加和删除的唯一方法,并且更改将直接在 arraylist 中进行,但我的问题是它正在添加和删除并且调试器上的数组列表计数或参考号看起来不错,但是当我搜索它时,我找不到新的。添加了对象,我仍然找到已删除的对象。 这是删除和添加方法

public void RemoveFromAnimalList(Animal A) {
    Iterator<Animal> i = AnimalList.iterator();
    while (i.hasNext()) {
        if (A == i.next()) {
            i.remove();
        }
    }
}   

public boolean AddNewAnimalList(Animal A) {
    ListIterator litr = AnimalList.listIterator();
    Animal B = null;
    while (litr.hasNext()) {
        B = (Animal) litr.next();

            litr.add(A);
            return true;

    }
    return false;
}

这是调用上面这些方法的方法,我已经尝试了所有方法并调试了所有方法,每次我都找不到新的 add 元素,即使 arraylist 编号看起来正确,我有 400 个对象,当我删除它时,它达到 399,然后当我再次添加它时,它又回到了 400,但是当我尝试打印并浏览对象时,我找不到新的对象。

public void FirstBirth() {
    TheXYAxisControl XYSave = null;
    int X = 0;
    int Y = 0;
    for (Animal A : AnimalList) {
        if (A.Type.equals("Empty")) {

            X = A.XAxis;
            Y = A.YAxis;
            XYSave = new TheXYAxisControl(X, Y);
            TheXYaxisArrayList.add(XYSave);

        }
    }
    Random RandomNumberGen = new Random();

    for (int s = 0; s < 3; s++) {

        int RandomNumberGenerator = RandomNumberGen.nextInt(TheXYaxisArrayList.size());

        Animal NewAnimal = new Animal(0, "Male", 0, TheXYaxisArrayList.get(RandomNumberGenerator).getX(), TheXYaxisArrayList.get(RandomNumberGenerator).getY(), 0);
        RemoveFromAnimalList(AnimalList.get(RandomNumberGenerator));
        AddNewAnimalList(NewAnimal);
        RemoveFromOtherList(TheXYaxisArrayList.get(RandomNumberGenerator));
    }

    int RandomNumberGenerator = RandomNumberGen.nextInt(TheXYaxisArrayList.size());
    Animal NewAnimal = new Animal(0, "Female", 0,  TheXYaxisArrayList.get(RandomNumberGenerator).getX(),    TheXYaxisArrayList.get(RandomNumberGenerator).getY(), 0);
    RemoveFromAnimalList(AnimalList.get(RandomNumberGenerator));
    AddNewAnimalList(NewAnimal);
    RemoveFromOtherList(TheXYaxisArrayList.get(RandomNumberGenerator));

}

如果您有任何问题或代码的其他部分我可以解释。

【问题讨论】:

  • 为什么不用arraylist的remove方法呢?
  • 仅供参考,您的方法和变量名称应以小写字母开头,这有助于将它们与对象区分开来。

标签: java arraylist iterator add


【解决方案1】:

您应该真正在您的 Collection、List、Iterator、ListIterator 等中使用 Java 泛型并避免强制转换。

您还与== 在此处签名比较:

if (A == i.next())

这只是比较 2 个参考。将其更改为:

if (A.equals(i.next()))

【讨论】:

  • 我怎样才能避免强制转换以及避免强制转换是什么意思?即使我避免强制转换,我的对象也会以我的方式直接添加到列表中??
  • 并且代码中的铸造部分无效,因为我不使用它。我需要修改它,但它不影响
  • 如果你这样声明你的列表:List&lt;Animal&gt; animalList = new ArrayList&lt;Animal&gt;();不需要需要做B = (Animal) litr.next();,而是你可以使用Animal B = litr.next();
【解决方案2】:

首先关于Java中代码外观的一些建议

  • 方法应以小写字母开头
  • 变量应以小写字母开头

问题可能是您没有比较对象的相等性,而只是比较它们是同一个对象。

运算符==,用于对象类型比较实例。换句话说,这比较了对分配对象的内存的引用。

如果我们想比较它们具有相同内容的对象,我们应该使用方法equals(Object object)

所以将if (A == i.next()) 替换为if (A.equals(i.next()))

此外,一个好的做法是将常量与值进行比较,因此A.Type.equals("Empty") 应该是"Empty".equals(A.Type)。这种做法可能会减少代码中不需要的 NullPointerExceptions。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2023-03-31
    • 2020-10-15
    相关资源
    最近更新 更多