Java - Итератор и Итерируемый - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь реализовать итерацию в классе, который содержит массив. Массив может содержать максимум 6 элементов. Кроме того, это кольцевой буфер, поэтому он может выглядеть как [x] [] [] [y] [x] [x], где 'y' - начальный индекс.

Если я использую итератор для просмотра элементов, он выводит только те элементы, которые действительно содержат значение. Моя проблема в том, что если я использую цикл for-each, он распечатывает все элементы.

Итак, это мой класс Iterator:

   int current = startIndex;

   @Override
    public boolean hasNext() {
        return elements[current] != null;
    }

    @Override
    public T next() {

        T t = (T) elements[current];

        current = (current+1) % MAX_SET_LENGTH;

        return t;
    }

И вот эти два цикла яиспользуя:

// This works fine
    Iterator it = set.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }

// This goes through all the elements, even if null (so hasNext() should return false)
    for (T element: set.getSet()) {
        System.out.println(element);
    }

Это из-за массива? Я хочу, чтобы цикл for-each рассматривал его не как массив из 6 слотов, а чтобы использовал мои методы hasNext () и next ().

1 Ответ

0 голосов
/ 18 октября 2019

Я не уверен, как вы этого хотели, но у меня есть некоторые предложения.

Есть некоторые вещи, которые вам нужно знать или делать (если вы этого не делаете).

  1. Создайте private inner class для вашего итератора. Он чище и позволяет повторно инициализировать некоторые важные значения при его вызове.

  2. В методе iterator() вернуть экземпляр закрытого класса итератора.

  3. Не увеличивать current. Сделайте копию в своем классе итератора и используйте это. Таким образом, вы будете перебирать одни и те же значения каждый раз, так как каждый раз будете начинать с одного и того же значения current (т.е. предполагая, что ваш массив не изменяется). Кроме того, если вы этого не сделаете, когда вы нажмете null, в следующий раз, когда вы попытаетесь выполнить итерацию, вы получите нулевое значение, и значения не будут напечатаны.

  4. Добавитьдополнительный тест по вашему hasNext() методу. Если ваш внутренний массив заполнен, он продолжит цикл, так как не будет найдено значение null для завершения итерации, поэтому hasNext() всегда будет возвращать true.

  5. И использовать for (T element : set) для вызова итератора с использованием цикла for.

...