1

在java中,我希望数组列表中的一个类的实例在其主循环完成后自行删除,不仅仅是一个随机的,而是实例本身。我该怎么做?

4

3 回答 3

2

java 的 List 类中的 remove 方法会删除您插入其中的确切对象,具体由 '==' 运算符确定。

这样的事情可能对你有用:

public interface IDeleteListener<T> {
    void delete(SelfDeleteItem<T> item);
}

public class SelfDeleteItem<T> {
    IDeleteListener<T> listener;
    T item;

    public SelfDeleteItem(T item) {
        this.item = item;
    }

    public void fireDelete() {
        listener.delete(this);
    }
            public void setDeleteListener(IDeleteListener<T> listener){
                this.listener = listener;
            }
}

public class DeleteList<T> {
    private List<SelfDeleteItem<T>> items;
    IDeleteListener<T> deleteListener;

    public DeleteList() {
        this.items = new ArrayList<SelfDeleteItem<T>>();
        this.deleteListener = new IDeleteListener<T>() {
            public void delete(SelfDeleteItem<T> item) {
                items.remove(item);
            }
        };
    }

    public SelfDeleteItem<T> add(T item) {
                    SelfDeleteItem<T> test= new SelfDeleteItem<T>(item);
                    test.setDeleteListener(this.deleteListener);
        this.items.add(test);
    }
}

一个例子:

DeleteList<String> list= //...
SelfDeleteItem<String> deleteItem = list.add("test");
deleteItem.fireDelete();

这段代码的工作方式是,每次将某个值的实例添加到 DeleteList 时,都会将其放置在包装器 SelfDeleteItem 中。自删除项目有一个监听器,当它想要被删除时它会通知它。DeleteList 将自己注册为何时需要删除 SelfDeleteItem 的侦听器,并在这种情况下继续删除 SelfDeleteItem。

这通过侦听器将列表与项目分离,并实现了允许项目自行删除的目标。

至于用途,这种方法对于音频和网络缓冲区缓存很有用。能够在不创建依赖项的情况下缓存或取消缓存对象是可取的。

于 2013-07-01T20:31:57.287 回答
1

类实例必须知道它在列表中。大概该类将具有在将实例添加到列表时调用的方法。然后,当实例想要将自己从列表中删除时,它会使用列表的“remove”方法,例如:“mainList.remove(this);”。

通常,您需要处理在课堂外添加和删除列表;类实例不应该知道或关心它是否在列表中。另一方面,有时一个类确实必须注意自己并将自己从列表和其他连接中解脱出来。

于 2013-07-01T20:23:44.760 回答
1

如果我正确理解了您的问题,您想删除已添加到 ArrayList 的特定对象实例。如果是这种情况,请在 main 方法的末尾调用:

public boolean remove(Object o) 

ArrayList的一种方法

这是该方法的工作原理。从此列表中删除第一次出现的指定元素(如果存在)。如果列表不包含该元素,则它不变。更正式地说,删除具有最低索引i(o==null ? get(i)==null : o.equals(get(i)))元素(如果存在这样的元素)。返回true此列表是否包含指定元素(或等效地,如果此列表因调用而更改)。

于 2013-07-01T20:13:10.227 回答