java - 如何实现ListIterator?

标签 java arraylist implementation listiterator

我创建了 ArrayList 的扩展 NullIgnoringArrayList,因为我的应用程序可能会不时添加空值。我知道还有各种其他方法可以处理这个问题,例如在插入之前检查 null 或在访问 ArrayList 时过滤掉 null。但我脑子里想这样做,而且进展顺利,但现在我不知道如何继续。

我应该实现 ListIterator,因为我的测试调用此方法。我在 ArrayList 内部的实现中达到了顶峰,但 ListItr 是一个私有(private)类,它使用 ArrayList 的私有(private)字段,而我在 NullIgnoringArrayList 中没有。

公平地说,我可能设计过度了,也许我应该放弃它。另一方面,人们可能会学到一两件事。

空忽略数组列表:

public class NullIgnoringArrayList<T> extends ArrayList<T> {

    @Override
    public boolean add(T element) {
        return !isNull(element) && super.add(element);
    }

    @Override
    public void add(int index, T element) {
        if (isNull(element)) {
            return;
        }
        super.add(index, element);
    }

    @Override
    public boolean addAll(Collection c) {
        return !isNull(c) && super.addAll(c);
    }

    @Override
    public boolean addAll(int index, Collection c) {
        return !isNull(c) && super.addAll(index, c);
    }

    @Override
    public ListIterator listIterator() {
        throw new NotImplementedException();
    }

    @Override
    public ListIterator listIterator(int index) {
        throw new NotImplementedException();
    }
}

简单列表迭代器:

public class SimpleListIterator<T> implements ListIterator {
    @Override
    public boolean hasNext() {
        return false;
    }

    @Override
    public Object next() {
        return null;
    }

    @Override
    public boolean hasPrevious() {
        return false;
    }

    @Override
    public Object previous() {
        return null;
    }

    @Override
    public int nextIndex() {
        return 0;
    }

    @Override
    public int previousIndex() {
        return 0;
    }

    @Override
    public void remove() {

    }

    @Override
    public void set(Object o) {

    }

    @Override
    public void add(Object o) {

    }
}

最佳答案

只需委托(delegate)方法调用到ListIterator<T>父级:

public class NullIgnoringArrayList<T> extends ArrayList<T> {

    ...

    @Override
    public ListIterator<T> listIterator() {
        return new SimpleListIterator<>(super.listIterator());
    }

    @Override
    public ListIterator<T> listIterator(int index) {
        return new SimpleListIterator<>(super.listIterator(index));
    }
}

public class SimpleListIterator<T> implements ListIterator<T> {

    private final ListIterator<T> underlying;

    public SimpleListIterator(ListIterator<T> underlying) {
        this.underlying = underlying;
    }

    @Override public boolean hasNext() {return underlying.hasNext();}
    @Override public T next() { return underlying.next(); }
    @Override public boolean hasPrevious() {return underlying.hasPrevious();}
    @Override public T previous() {return underlying.previous();}
    @Override public int nextIndex() {return underlying.nextIndex();}
    @Override public int previousIndex() {return underlying.previousIndex();}
    @Override public void remove() { underlying.remove();}

    @Override
    public void set(T o) {
        if (isNull(o)) {return;}
        underlying.set(o);
    }

    @Override
    public void add(T o) {
        if (isNull(o)) {return;}
        underlying.add(o);
    }
}

关于java - 如何实现ListIterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44508220/

相关文章:

java - 将列表转换为基于 boolean 属性的集合的最简单方法?

java - Telegram Java API-套接字连接问题

java - 将java文件转换为Excel电子表格

Android 类 Parcelable 与 ArrayList

c - 理解 libm 中日志操作中的数字文字

java - Java 中泛型类型的树实现

Java:在 GUI 中显示崩溃,但禁止显示警告

java - arraylist 删除无法正常工作 IOBE

java - 实际参数列表和正式参数列表的长度不同?

java - 实现扩展接口(interface) J 的接口(interface) I 的类 B 是否也扩展类型 I?