You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中ArrayList元素移除时如何实现打印提示?

嘿,我懂你想要实现的效果——当ArrayList里的元素被移除时自动打印指定文本对吧?我之前也遇到过类似需求,给你几个实际能跑起来的方案,你可以试试~

方案一:自定义ArrayList子类(最简单直接)

直接继承ArrayList,重写所有和移除元素相关的方法,在方法里先执行原逻辑,再触发打印操作。这样所有移除元素的操作都会自动触发文本输出。

import java.util.ArrayList;

public class ObservableArrayList<E> extends ArrayList<E> {
    // 移除指定索引的元素
    @Override
    public E remove(int index) {
        E removedElement = super.remove(index);
        System.out.println("元素已被移除:" + removedElement);
        return removedElement;
    }

    // 移除指定对象的元素
    @Override
    public boolean remove(Object o) {
        boolean isRemoved = super.remove(o);
        if (isRemoved) {
            System.out.println("元素已被移除:" + o);
        }
        return isRemoved;
    }

    // 可选:监听批量移除操作
    @Override
    public boolean removeAll(Collection<?> c) {
        boolean hasChanged = super.removeAll(c);
        if (hasChanged) {
            System.out.println("批量移除了元素:" + c);
        }
        return hasChanged;
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        ObservableArrayList<String> fruitList = new ObservableArrayList<>();
        fruitList.add("草莓");
        fruitList.add("芒果");
        fruitList.add("蓝莓");

        fruitList.remove(1); // 输出:元素已被移除:芒果
        fruitList.remove("草莓"); // 输出:元素已被移除:草莓
    }
}
方案二:装饰器模式包装ArrayList(更灵活)

如果不想直接继承ArrayList,或者需要给已有的List添加监听功能,可以用装饰器模式包装原List。这种方式更符合开闭原则,不会修改原List的代码。

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class ObservableListDecorator<E> implements List<E> {
    private final List<E> originalList;

    public ObservableListDecorator(List<E> originalList) {
        this.originalList = originalList;
    }

    @Override
    public E remove(int index) {
        E removedElement = originalList.remove(index);
        System.out.println("元素被移除:" + removedElement);
        return removedElement;
    }

    @Override
    public boolean remove(Object o) {
        boolean isRemoved = originalList.remove(o);
        if (isRemoved) {
            System.out.println("元素被移除:" + o);
        }
        return isRemoved;
    }

    // 注意:需要实现List接口的所有方法,大部分直接委托给原List即可
    @Override
    public int size() {
        return originalList.size();
    }

    @Override
    public boolean isEmpty() {
        return originalList.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        return originalList.contains(o);
    }

    @Override
    public Iterator<E> iterator() {
        // 可选:重写迭代器的remove方法,监听迭代器移除操作
        return new Iterator<E>() {
            private final Iterator<E> iterator = originalList.iterator();
            private E lastAccessedElement;

            @Override
            public boolean hasNext() {
                return iterator.hasNext();
            }

            @Override
            public E next() {
                lastAccessedElement = iterator.next();
                return lastAccessedElement;
            }

            @Override
            public void remove() {
                iterator.remove();
                System.out.println("通过迭代器移除了元素:" + lastAccessedElement);
            }
        };
    }

    // 其他List接口方法(add、get、clear等)都直接委托给originalList,这里省略,可根据IDE提示补全
}

使用示例

public class Main {
    public static void main(String[] args) {
        List<String> petList = new ArrayList<>();
        ObservableListDecorator<String> observablePetList = new ObservableListDecorator<>(petList);
        
        observablePetList.add("柯基");
        observablePetList.add("布偶猫");
        
        // 使用迭代器移除
        Iterator<String> iterator = observablePetList.iterator();
        while (iterator.hasNext()) {
            String pet = iterator.next();
            if (pet.equals("柯基")) {
                iterator.remove(); // 输出:通过迭代器移除了元素:柯基
            }
        }
    }
}
补充说明

如果你的项目用的是JavaFX这类框架,框架本身提供了ObservableList,自带元素变更监听API,直接用就好;但如果是普通Java项目,上面两种方案就足够解决问题了。

内容的提问来源于stack exchange,提问作者sidelaunch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:51:17