从对象数组列表中删除对象

i1icjdpr  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(334)

我已经创建了一个对象数组列表,

private ArrayList<Object> objects;

我正在一个构造函数中初始化它。

public ObjectManager(Handler handler) {
    this.handler = handler;

    objects = new ArrayList<>();
}

然后将此arraylist绘制/添加到画布中。

public void renderObjects(Graphics g) {
    handler.getObjectManager().addObject(new InstanceOfObject(handler, 1000, 1000, g));
}

方法addobject()将对象添加到arraylist。

public void addObject(Object e) {
    objects.add(e);
}

我想稍后用类似的代码行删除这个对象,

public void removeObject(Object e) {
    objects.remove(e);
}

然而,我不知道怎么做,因为我不知道如何传递的对象是被删除。我唯一能想到的传入对象的方法是执行以下操作:

handler.getObjectManager().removeObject(new InstanceOfObject(handler, 1000, 1000, g));

我甚至不知道这是否有效,因为它正在删除一个“新”对象。即使是这样,“g”也没有定义。如果我在构造函数中定义它,我必须更改许多不同的东西,这会导致错误(通常是nullpointerexception),但即使这样,我也无法通过传入graphics g参数来调用此方法。

f1tvaqid

f1tvaqid1#

你的问题不清楚,但这可能会有帮助。
这个 List 接口实现者 ArrayList 已经提供了 remove 方法。你没必要再发明它。

对象引用

要删除对象,请保留并传递对特定对象的引用。

Dog alice = new Dog( "Alice" , "Labrador" ) ;
Dog bob = new Dog( "Bob" , "Chihuahua" ) ;

List< Dog > dogs = new ArrayList<>() ;
dogs.add( alice ) ;
dogs.add( bob ) ;
…
dogs.remove( bob ) ;

索引编号

或者,记住包含要删除的对象的列表的槽(索引)。将从零开始的索引号传递给 remove 方法。

mgdq6dx1

mgdq6dx12#

实际上,您可以在web上找到java的源代码(如https://github.com/adoptopenjdk/openjdk-jdk11/blob/master/src/java.base/share/classes/java/util/arraylist.java#l644),甚至作为jdk本身中的src.zip。所以这就是 remove() 看起来像:

public boolean remove(Object o) {
    final Object[] es = elementData;
    final int size = this.size;
    int i = 0;
    found: {
        if (o == null) {
            for (; i < size; i++)
                if (es[i] == null)
                    break found;
        } else {
            for (; i < size; i++)
                if (o.equals(es[i]))
                    break found;
        }
        return false;
    }
    fastRemove(es, i);
    return true;
}

虽然带有标记断点的循环看起来有点深奥,但重要的是 o.equals() :如果您的“ InstanceOfObject “类实现自己的 equals() ,您也可以使用新创建的一次性示例进行比较。

相关问题