Java中的循环数据结构

时间:2013-12-03 05:02:55

标签: java arrays loops iterator

是否有迭代器循环遍历数据结构?

假设有一个数组:

int[] arr = {-1,5,7,-1,-1,-1}

我想从此数组中找到第一个非-1值的索引并开始从随机位置搜索(idx = random.nextInt(arr.length) )。例如,idx = 4;

首先检查是否arr [4] == -1,然后检查arr [5] == -1等等。 如果到达阵列的末尾然后从0位置开始并继续,直到找到非-1 。保证数组中至少有一个值不等于-1。

可以这样做:

int idx = -1;
for (int i = random.nextInt(arr.length); ; i++) {
   if (i == arr.length) {
        /** start over */
        i = 0;
   }
   if (-1 != arr[i]) {
       idx = i;
       break;
   }
}

左右:

int idx = -1;
int i   = random.nextInt(arr.length);

do {
   if (-1 != arr[i]) {
      idx = i;
   }      
   i == arr.length ? i=0 : i++;
} while (-1 == idx);

是否有一个Iterator,它支持循环(调用next(),如果到达数组的末尾然后自动从0开始)?

限制:1)不考虑效率; 2)首选标准Java API。

3 个答案:

答案 0 :(得分:2)

在java API中没有这样的api可以满足你的问题,但你可以自己创建它。

您可以使用List创建LinkedList。解决你的问题。

您可以将List扩展到您的班级(CircularLinkedList extends List)&然后覆盖方法hasNext()& getNext()这就是你所需要的一切。

答案 1 :(得分:1)

我不认为在调用next()时有任何迭代器可以让您知道元素的索引,因此您必须分别跟踪当前索引。您可以使用Guava的Iterators.concat(或其他一些第三方类)来构建一个“环绕式”迭代器,以在数组的尾部部分连接迭代器,并在前导部分上使用迭代器。但是,我认为代码可能比简单的for循环更复杂。

答案 2 :(得分:1)

我相信没有这样的循环迭代器,一旦到达终点就会自动转到数组的开头。我在下面创建了一个(没有经过测试,设计有缺陷),这需要一个全新的代码类,并且比你的short / while循环要长得多。

public class MyCircularIterator<E> implements Iterator<E> {
    private List<E> list;
    private int pos;

    public MyCircularIterator(List<E> list) {
        this(list, 0);
    }

    public MyCircularIterator(List<E> list, int start) {
        this.list = list;
        pos = start;
    }

    public boolean hasNext() {
        if(list.get(pos) != -1) return false;
            return true;
    }

    public E next() {
        if(hasNext()) {
            E obj = list.get(pos);
            pos = (pos + 1) % list.size();
            return obj;
        }
    }

    public void remove() {
         list.remove(this.nextIndex); 
    }
}