Generator functions equivalent in Java

后端 未结 7 859
后悔当初
后悔当初 2020-12-01 03:50

I would like to implement an Iterator in Java that behaves somewhat like the following generator function in Python:

def iterator(array):
   for         


        
相关标签:
7条回答
  • 2020-12-01 04:06

    I wish Java had generator/yield, but since it doesn't using Iterators is probably your best bet.

    In this example I stuck with arrays, but in general I would advise using Iterable Collection instead, eg. List. In the example I show how it's pretty easy to get iterators for arrays though:

    package example.stackoverflow;
    
    import com.sun.xml.internal.xsom.impl.scd.Iterators;
    
    import java.util.Arrays;
    import java.util.Iterator;
    
    public class ArrayGenerator<T> implements Iterable<T> {
        private final T[][][] input;
    
        public ArrayGenerator(T[][][] input) {
            this.input = input;
        }
    
    
        @Override
        public Iterator<T> iterator() {
            return new Iter();
        }
    
        private class Iter implements Iterator<T> {
            private Iterator<T[][]> x;
            private Iterator<T[]> y;
            private Iterator<T> z;
    
            {
                x = Arrays.asList(input).iterator();
                y = Iterators.empty();
                z = Iterators.empty();
            }
    
            @Override
            public boolean hasNext() {
                return z.hasNext() || y.hasNext() || x.hasNext();
            }
    
            @Override
            public T next() {
                while(! z.hasNext()) {
                    while(! y.hasNext()) {
                        y = Arrays.asList(x.next()).iterator();
                    }
                    z = Arrays.asList(y.next()).iterator();
                }
                return z.next();
            }
    
            @Override
            public void remove() {
                throw new UnsupportedOperationException("remove not supported");
            }
        }
    
        public static void main(String[] args) {
            for(Integer i :
                    new ArrayGenerator<Integer>(
                            new Integer[][][]{
                              {
                                {1, 2, 3},
                                {4, 5}
                              },
                              {
                                {},
                                {6}
                              },
                              {
                              },
                              {
                                {7, 8, 9, 10, 11}
                              }
                            }
                    )) {
                System.out.print(i + ", ");
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题