首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现ListIterator?

如何实现ListIterator?
EN

Stack Overflow用户
提问于 2017-06-12 20:30:13
回答 1查看 2.1K关注 0票数 0

我创建了ArrayList,NullIgnoringArrayList的这个扩展,因为我的应用程序可能会不时添加nulls。我知道处理这个问题的其他方法有很多种,比如在访问ArrayList时插入或过滤空值之前检查null。但是我脑子里想的就是这样做,而且一切都很顺利,但现在我不知道该怎么做了。

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

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

NullIgnoringArrayList:

代码语言:javascript
复制
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();
    }
}

SimpleListIterator:

代码语言:javascript
复制
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) {

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-12 20:57:04

只需将委托方法调用到父级的ListIterator<T>

代码语言:javascript
复制
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);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44508220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档