是否有迭代器循环遍历数据结构?
假设有一个数组:
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。
答案 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);
}
}