Индекс не увеличивается при реализации Итератора - PullRequest
0 голосов
/ 13 марта 2020

Итак, я создал класс DiceCollection, который реализует Iterator и его классы. При выполнении модульных тестов мой метод next (), похоже, не увеличивает мой индекс, и я не уверен, в чем причина этого.

public class DiceCollection implements Iterator<De> {
 public int position = 0;
 public int endPosition = 3;
 private De[] diceList;

 @Override
 public boolean hasNext() {
    return position < endPosition;
 }

 @Override
 public De next() {
    De de = diceList[position];     
    position++;
    return de;
 }
}

Теперь при вызове метода next (), мой индекс позиции остается прежним:

    Iterator<De> iter = des.creerIterateur();
    System.out.println(iter.hasNext());
    System.out.println(des.position + "/" + des.endPosition);
    System.out.println(iter.next());
    System.out.println(des.position + "/" + des.endPosition);
    System.out.println(iter.hasNext());
    System.out.println(iter.next());
    System.out.println(des.position + "/" + des.endPosition);
    System.out.println(iter.hasNext());
    System.out.println(iter.next());
    System.out.println(iter.hasNext());
    System.out.println(iter.next()); //null

Я получаю этот вывод:

true
0/3
De [valeur=0, nbFaces=6]
0/3
true
De [valeur=0, nbFaces=8]
0/3
true
De [valeur=0, nbFaces=10]
true
null

Ответы [ 3 ]

1 голос
/ 13 марта 2020

Код работает, но вы смотрите на неправильные значения объекта. Только значения внутри iter меняются. Попробуйте это?

 Iterator<De> iter = des.creerIterateur();
System.out.println(iter.hasNext());
System.out.println(iter.position + "/" + iter.endPosition);
System.out.println(iter.next());
System.out.println(iter.position + "/" + iter.endPosition);
System.out.println(iter.hasNext());
System.out.println(iter.next());
System.out.println(iter.position + "/" + iter.endPosition);
System.out.println(iter.hasNext());
System.out.println(iter.next());
System.out.println(iter.hasNext());
System.out.println(iter.next()); //null
1 голос
/ 13 марта 2020

Вы вызываете метод next () для объекта iter при печати атрибута позиции объекта des. При вызове next () атрибут позиции объекта iter изменяется, но не атрибут des.position.

System.out.println(des.next());
System.out.println(des.position + "/" + des.endPosition);

Должен выводить правильные значения.

1 голос
/ 13 марта 2020

Работает нормально. Я проверил это так. Но я не уверен, как вы передавали значения в приватный массив. Вот как вы должны это реализовать.

        Dice[] array = {new Dice(1), new Dice(2)};
        DiceCollection d = new DiceCollection(array);
        Iterator<Dice> it = d.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("Using iterable");
        // And since iterable has been implemented.
        for (Dice di : d) {
           System.out.println(di);
        }


class Dice {
    int v;
    public Dice(int v) {
        this.v = v;
    }
    public String toString() {
        return v +"";
    }
}

class DiceCollection implements Iterable<Dice> {
    private Dice[] diceList;

    public DiceCollection(Dice[] arr) {
        diceList = arr;
    }

    private class MyIterator implements Iterator<Dice> {

        private int position = 0;

        @Override
        public boolean hasNext() {
            return position < diceList.length;
        }

        @Override
        public Dice next() {
            Dice de = diceList[position];
            position++;
            return de;
        }
    }

    public Iterator<Dice> iterator() {
        return new MyIterator();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...