如何使用迭代器迭代替代元素?

Ran*_*hir 6 java iterator

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将按顺序迭代1到6.我们可以交替迭代相同的列表,以便在1, 3, 5不更改while循环的情况下进行打印吗?

dan*_*niu 12

创建自己的Iterator.

class SkippingIterator<T> implements Iterator<T> {
    private List<T> list;
    private currentPosition;
    private int skipBy;
    public SkippingIterator(List<T> l) {
        this(l, 2);
    }
    public SkippingIterator(List<T> l, int skip) {
        this(l, skipBy, 0);
    }
    public SkippingIterator(List<T> l, int skip, int startPosition) {
        list = l;
        skipBy = skip;
        currentPosition = startPosition;
    }
    public boolean hasNext() {
        return currentPosition < list.size();
    }
    public T next() {
        T result = list.get(currentPosition);
        currentPosition += skip;
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

制作你的代码

List<Integer> list = Arrays.asList(1,2,3,4,5,6);
Iterator it = new SkippingIterator<>(list);
while(it.hasNext()){
    System.out.println(it.next());
}
Run Code Online (Sandbox Code Playgroud)

  • hasNext方法是否也应该使用skipyBy属性,如`(currentPosition + skipBy)<= list.size()`? (3认同)
  • @daniu非常好,但我认为这在java-8中更容易实现,因为有一个`tryAdvance`方法IMO ... /sf/answers/3523237231/,我还是upvoted (2认同)

Swe*_*per 7

你只想打印奇数?使用流过滤列表:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
Iterator<Integer> it = list.stream().filter(x -> x % 2 == 1).iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你想获得所有其他元素,那么使用流将不太合适,但你仍然可以这样做:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
int limit = list.size() / 2 - (1 - list.size() % 2);
Iterator<Integer> it = IntStream.iterate(0, x -> x + 2).limit(limit).map(list::get).iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}
Run Code Online (Sandbox Code Playgroud)

我推荐daniu的解决方案.


spr*_*ter 6

一个简单的机制是只使用列表项的索引:

IntStream.range(0, list.size())
    .filter(i -> i % 2 == 0)
    .mapToObj(list::get)
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

如果你特别想要一个迭代器,只需要调用iterator()而不是forEach.


Era*_*ran 5

是的你可以.在while循环体内,检查迭代器是否有下一个元素,如果有,则再次推进迭代器.这将导致偶数元素不被打印.

List<Integer> list=Arrays.asList(1,2,3,4,5,6);
Iterator it=list.iterator();
while (it.hasNext()){
    System.out.println(it.next());
    if (it.hasNext()) {
        it.next();
    }
}
Run Code Online (Sandbox Code Playgroud)