Python 具有允许无限循环项目列表的 itertools 库。
cycle('ABCD') --> A B C D A B C D ...
java - 除了数组,如何在java中实现相同的功能?例如:
int[] a = { 1, 2, 3, 4};
cycle(a) = 1, 2, 3, 4, 1, 2, 3, 4 ....
如果使用番石榴是一个选项,它已经具有:
Iterables.cycle
这个怎么样:
public void cycle( int[] a ) {
while ( true ) {
for ( int val : a ) {
...
}
}
}
并通过回调使其有用:
public interface Callback<T> {
public void execute( T value );
}
public <T> void cycle( T[] a, Callback<T> callback ) {
while ( true ) {
for ( T val : a ) {
callback.execute( val );
}
}
}
有趣的是,您也可以制作这样的迭代器。
public static void main(String[] args) {
Integer[] A = new Integer[]{1,2,3};
CyclicArrayIterator<Integer> iter = new CyclicArrayIterator<>(A);
for(int i = 0; i < 10; i++){
System.out.println(iter.next());
}
}
Guava 的方法似乎最干净,但如果您不想包含任何依赖项。这是您可以使用的 CyclicIterator 类。
/**
* An iterator to loop over an array infinitely.
*/
public class CyclicArrayIterator<T> implements Iterator<T> {
private final T[] A;
private int next_index = 0;
public CyclicArrayIterator(T[] array){
this.A = array;
}
@Override
public boolean hasNext() {
return A[next_index] != null;
}
@Override
public T next() {
T t = A[next_index % A.length];
next_index = (next_index + 1) % A.length;
return t;
}
@Override
public void remove() {
throw new ConcurrentModificationException();
}
}
希望能帮助到你。