Java 列表最佳实践

发布于 2024-12-01 18:45:47 字数 110 浏览 1 评论 0原文

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

I need some container to keep elements so, if I'll try to get the size()+i element, i'll get element number i. Or with iterator, which starts from the beginning of container after it tries to get the last element? What are the best practicies in both cases? I mean performance and easy useability.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

简单 2024-12-08 18:45:47

您可以创建 ArrayList 的简单子类并重写 get(int n) 方法,如下所示:

public T get(int n)
{
    return super.get(n % this.size());
}

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

编辑:

假设您的新类名为 RingList,这里有一个示例 RingIterator (未经测试):

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 中的 iterator() 方法,如下所示

public Iterator<T> iterator()
{
    return new RingIterator(this);
}

You could create a simple subclass of ArrayList<T> and override the get(int n) method as follows:

public T get(int n)
{
    return super.get(n % this.size());
}

As to the iterator, you will need to implement your own, which shouldn't be all that hard.

EDIT:

Assuming your new class is called RingList, here's a sample RingIterator (untested):

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(); }
}

You would then override the iterator() method in RingList<T> as

public Iterator<T> iterator()
{
    return new RingIterator(this);
}
九公里浅绿 2024-12-08 18:45:47

对于第一部分,也许只需要 n % list.size()

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

For the first part, just ask for n % list.size() perhaps?

For the iterator part, create a class that wraps an iterator, and when next() returns null, just have it reset the iterator.

夏の忆 2024-12-08 18:45:47

谢谢大家,这就是我创建的:

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 方法:

/*
 * Returns ring iterator,
 * use it with 'ParentClass' type.
 */
public RingIterator<SubClass> getRingIter(int i) {
    return new RingIterator(_subs.listIterator(i),_subs);
}

我使用它:

RingIterator<SubClass> ri = _logic.getRingIter(1);
ParentClass ai = ri.next();

我只想通过 getRingIter 只提供类型 ParentClass (而不是子类),但我没有找到一种方法可以在不创建的情况下做到这一点列表 - 列表的转换。

Thanks everyone, thats what I've created:

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();
}

}

Then get method:

/*
 * Returns ring iterator,
 * use it with 'ParentClass' type.
 */
public RingIterator<SubClass> getRingIter(int i) {
    return new RingIterator(_subs.listIterator(i),_subs);
}

And I use it:

RingIterator<SubClass> ri = _logic.getRingIter(1);
ParentClass ai = ri.next();

I wanted to make only type ParentClass (not SubClass) available via getRingIter, but I don't see a way to do it with no creation of List - convertion of List.

最好是你 2024-12-08 18:45:47

扩展 ArrayList 类并按照您喜欢的方式实现 get(Integer) 方法。我认为这是“最佳实践”。

Extend the ArrayList class and implement the get(Integer) method the way you like. I think this is the 'best practice'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文