Java 什么样的数据结构可以用于循环操作?

Java 什么样的数据结构可以用于循环操作?,java,queue,circular-buffer,Java,Queue,Circular Buffer,什么样的数据结构最适合存储在一个循环中的对象?例如,我有一个对象列表,a,B,C,D,E,我需要循环处理它们,a->B->C->D->E,然后E->a->B->C->D- 处理这种情况的最好方法是什么?谢谢我在考虑一个圆形数组,但根据维基百科,循环数组最适合用于实现队列。您需要一个循环列表,它是一个尾部位于列表头部的列表您需要一个循环列表,它是一个尾部位于列表头部的列表您可以编写自己的列表-它非常简单 这使得任何Iterable都是循环的,但如果给定一个空集合,则会旋转。修复留给学生的问题,但记

什么样的数据结构最适合存储在一个循环中的对象?例如,我有一个对象列表,a,B,C,D,E,我需要循环处理它们,a->B->C->D->E,然后E->a->B->C->D-


处理这种情况的最好方法是什么?谢谢我在考虑一个圆形数组,但根据维基百科,循环数组最适合用于实现队列。

您需要一个循环列表,它是一个尾部位于列表头部的列表

您需要一个循环列表,它是一个尾部位于列表头部的列表

您可以编写自己的列表-它非常简单

这使得任何
Iterable
都是循环的,但如果给定一个空集合,则会旋转。修复留给学生的问题,但记住
队列
也是一个
集合

class Circular<T> implements Iterable<T> {
    final Iterable<T> it;

    public Circular(Iterable<T> it) {
        this.it = it;
    }

    @Override
    public Iterator<T> iterator() {
        return new CircularIterator();
    }

    private class CircularIterator implements Iterator<T> {
        // Start the ball rolling.
        Iterator<T> i = it.iterator();

        @Override
        public boolean hasNext() {
            // We're circular - we always have a next.
            return true;
        }

        @Override
        public T next() {
            // Will loop until collection has elements. Could be a Queue of course.
            while (!i.hasNext()) {
                i = it.iterator();
            }
            return i.next();
        }

    }
}

public void test() {
    List<String> l = Arrays.asList("A", "B", "C", "D");
    int i = 0;
    for (String s : new Circular<String>(l)) {
        System.out.println(s);
        if (i++ > 10) {
            break;
        }
    }
}
类循环实现Iterable{
最后,它是可复制的;
公共通告(Iterable it){
this.it=it;
}
@凌驾
公共迭代器迭代器(){
返回新的循环器();
}
私有类循环器实现迭代器{
//开始滚动。
迭代器i=it.Iterator();
@凌驾
公共布尔hasNext(){
//我们是循环的-我们总是有下一个。
返回true;
}
@凌驾
公共交通工具{
//将循环,直到集合包含元素。当然可以是队列。
而(!i.hasNext()){
i=it.iterator();
}
返回i.next();
}
}
}
公开无效测试(){
listl=数组。asList(“A”、“B”、“C”、“D”);
int i=0;
用于(字符串s:新圆形(l)){
系统输出打印项次;
如果(i++>10){
打破
}
}
}

您可以自己编写—非常简单

这使得任何
Iterable
都是循环的,但如果给定一个空集合,则会旋转。修复留给学生的问题,但记住
队列
也是一个
集合

class Circular<T> implements Iterable<T> {
    final Iterable<T> it;

    public Circular(Iterable<T> it) {
        this.it = it;
    }

    @Override
    public Iterator<T> iterator() {
        return new CircularIterator();
    }

    private class CircularIterator implements Iterator<T> {
        // Start the ball rolling.
        Iterator<T> i = it.iterator();

        @Override
        public boolean hasNext() {
            // We're circular - we always have a next.
            return true;
        }

        @Override
        public T next() {
            // Will loop until collection has elements. Could be a Queue of course.
            while (!i.hasNext()) {
                i = it.iterator();
            }
            return i.next();
        }

    }
}

public void test() {
    List<String> l = Arrays.asList("A", "B", "C", "D");
    int i = 0;
    for (String s : new Circular<String>(l)) {
        System.out.println(s);
        if (i++ > 10) {
            break;
        }
    }
}
类循环实现Iterable{
最后,它是可复制的;
公共通告(Iterable it){
this.it=it;
}
@凌驾
公共迭代器迭代器(){
返回新的循环器();
}
私有类循环器实现迭代器{
//开始滚动。
迭代器i=it.Iterator();
@凌驾
公共布尔hasNext(){
//我们是循环的-我们总是有下一个。
返回true;
}
@凌驾
公共交通工具{
//将循环,直到集合包含元素。当然可以是队列。
而(!i.hasNext()){
i=it.iterator();
}
返回i.next();
}
}
}
公开无效测试(){
listl=数组。asList(“A”、“B”、“C”、“D”);
int i=0;
用于(字符串s:新圆形(l)){
系统输出打印项次;
如果(i++>10){
打破
}
}
}

此外,循环链表将提供动态内存分配。如果您只需要这些,一个简单的数组就可以了。当索引达到array.length时,返回索引0。您的示例建议您一次处理一个周期,然后在处理另一个周期之前停止。这是正确的吗?如果是,您希望如何找到循环的第一个元素?您想使用整数索引吗?另外,循环链表将提供动态内存分配。如果您只需要这些,一个简单的数组就可以了。当索引达到array.length时,返回索引0。您的示例建议您一次处理一个周期,然后在处理另一个周期之前停止。这是正确的吗?如果是,您希望如何找到循环的第一个元素?你想使用积分指数吗?“你需要”有点太强了。循环列表是一种可能的实现,与其他实现相比,它有一系列优点和缺点。“您需要”有点太强了。循环列表是一种可能的实现,与其他实现相比,它有一系列优点和缺点。