4

配列を際限なく反復するカスタム反復子を作成する必要があります。これまでJavaでイテレータを使用したことがないことを考えると、これを行う方法がわかりません。誰かが私を助けてくれて説明してくれたら、とてもありがたいです。

public class Numbers{   
private int[] array;

public Numbers(int[] array){ 
    this.array = array
}
    public static void main(String[] args) {

        Numbers n = new Numbers();
        Iterator num = n.sequence();
        for(int i = 0; i < 10; i++){
            if (num.hasNext()){
                System.out.print(num.next() + " ");
                System.out.println();
            }
        }
    }
}
4

3 に答える 3

4

下記参照:

public class Numbers implements Iterable<Integer> {
    private int[] array;
    private int i;
    public Numbers(int[] array) { 
        this.array = array;
        i = 0; 
    }

    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            @Override
            public boolean hasNext() { return true; }

            @Override
            public Integer next() {
                int j = i;
                i = (i + 1) % array.length;
                return array[j];
            }

            @Override
            public void remove() {}
        };
    }
}

その後、次のことができます。

Numbers n = new Numbers(new int[]{1,2,3});
for (int i : n)
    System.out.println(i);  // or anything else

これにより、無限ループが発生します。

1
2
3
1
2
3
12 ..。
_

関連するjavadocs:
-イテレータ
-イテレータ


それを行う別の方法は、そのように無限のwhileループを持つことです。

int[] array = new int[]{1, 2, 3};
int i = 0;
while (true) {
    System.out.println(array[i]);  // or anything else
    i = (i + 1) % array.length;
}
于 2012-09-05T23:27:05.293 に答える
1

これは基本的にイテレータの仕組みです。この例ではを使用してListいますが、を実装する任意のコレクションに対してイテレータを使用できますjava.lang.Iterable

List<String> someList; // assume this has been instantiated and has values in it

ListIterator<String> it = someList.listIterator();
while (it.hasNext()) {
    String value = it.next();

    // do something with value
}

ほとんどの場合、イテレータへの参照を提供するようにコレクションに指示することで、イテレータをインスタンス化します。次に、を呼び出してループしますhasNext()。これにより、要素がなくなるまで続行します。toを呼び出すとnext()、イテレータから次のアイテムがプルされ、その位置が1つ増えます。を呼び出すと、 (または。)によって返された最後のアイテムremove()がリストから削除されます。next()previous()

もちろん、上記の例のように、リストに対して使用するために最適化された特別な実装であるため、java.util.ListIterator代わりに使用していることに注意してください。java.util.IteratorListIteratorIterator

配列に対してイテレータを使用することはできません。Listバニラのforループを使用するか、それをを実装するまたは別のオブジェクトに変換する必要がありますIterable

上記のリストを際限なくループするには、ループは次のようになります。

while(it.hasNext()) {
    String value = it.next();

    // do processing

    if (!it.hasNext()) {
        it = someList.listIterator(); // reset the iterator
    }
}

forループを無限に使用して配列をループするには:

for (int i = 0; i < myArray.length; i++) {
    myArray[i];
    // do something

    if (i == myArray.length - 1) {
        i = 0; // reset the index
    }
}

Numbersまたは、クラスに直接実装させることもできますIterable

于 2012-09-05T23:26:44.590 に答える
0

イテレータの操作は基本的に常に同じです。

まず、配列からイテレータを取得します。

Iterator iterator = yourArray.iterator();

アイテムがある間、2番目に繰り返します。

while(iterator.hasNext()) {
  Object element = iterator.next(); 
}
于 2012-09-05T23:24:38.183 に答える