首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java list最佳实践

Java list最佳实践
EN

Stack Overflow用户
提问于 2011-08-27 04:21:29
回答 4查看 2.3K关注 0票数 3

我需要一些容器来保存元素,所以,如果我尝试获取size()+i元素,我将获得元素编号i。或者使用迭代器,它在尝试获取最后一个元素后从容器的开头开始?这两种情况下的最佳实践是什么?我的意思是性能和易用性。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-27 04:26:15

对于第一部分,也许只需要n % list.size()就可以了?

对于迭代器部分,创建一个包装迭代器的类,当next()返回null时,只需让它重置迭代器。

票数 2
EN

Stack Overflow用户

发布于 2011-08-27 04:25:37

您可以创建一个简单的ArrayList<T>子类并覆盖get(int n)方法,如下所示:

代码语言:javascript
复制
public T get(int n)
{
    return super.get(n % this.size());
}

至于迭代器,您需要实现自己的迭代器,这应该不是那么困难。

编辑:

假设您的新类名为RingList,下面是一个示例RingIterator (未经测试):

代码语言:javascript
复制
public class RingIterator<T> implements Iterator<T>
{
    private int cur = 0;
    private RingList<T> coll = null;

    protected RingIterator(RingList<T> coll) { this.coll = coll; }
    public boolean hasNext() { return size() > 0; }
    public T next() 
    { 
        if (!hasNext()) 
            throw new NoSuchElementException();
        int i=cur++; 
        cur=cur%size(); 
        return coll.get(i);
    }
    public void remove() { throw new UnsupportedOperationException(); }
}

然后将RingList<T>中的iterator()方法重写为

代码语言:javascript
复制
public Iterator<T> iterator()
{
    return new RingIterator(this);
}
票数 9
EN

Stack Overflow用户

发布于 2011-08-27 23:18:36

谢谢大家,这就是我所创造的:

代码语言:javascript
复制
public class RingIterator<E> {
private List<E> _lst;
private ListIterator<E> _lstIter;

public RingIterator(ListIterator<E> iter, List<E> lst) {
    super();
    _lstIter = iter;
    _lst = lst;
}

public E next() {
    if(!_lstIter.hasNext())
        _lstIter = _lst.listIterator();
    return _lstIter.next();
}

public E previous() {
    if(!_lstIter.hasPrevious())
        _lstIter = _lst.listIterator(_lst.size());
    return _lstIter.previous();
}

}

那么get方法:

代码语言:javascript
复制
/*
 * Returns ring iterator,
 * use it with 'ParentClass' type.
 */
public RingIterator<SubClass> getRingIter(int i) {
    return new RingIterator(_subs.listIterator(i),_subs);
}

我使用它:

代码语言:javascript
复制
RingIterator<SubClass> ri = _logic.getRingIter(1);
ParentClass ai = ri.next();

我希望通过getRingIter只提供类型ParentClass (而不是SubClass),但我没有看到一种方法来实现这一点,而不创建列表-列表的转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7210172

复制
相关文章

相似问题

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