2015-10-25 4 views
1

Я пишу функцию с именем public Iterator<E> iterator(int index), которая возвращает итератор, начинающийся с указанной позиции ('index') в списке. Указанный индекс основан на 0. Мой код до сих пор ниже.Как создать метод итератора, который итерации начинается с определенной позиции

public Iterator<E> iterator(int index) { 
     Iterator<E> it = iterator(index); 
     while (it.hasNext()) { 
      E item = it.next(); 
      System.out.println(item); 

     } 
     return it; 
    } 

Код в основном выглядит следующим образом.

public static void main(String[] args) { 

     LinkedList<Integer> lst = new LinkedList<Integer>(); 

     lst.add(3); 
     lst.append(6); 
     lst.append(5); 
     lst.append(7); 

     lst.iterator(1); 

lst - это связанный список. Когда я пытаюсь вызвать метод iterator на нем, проходящий в 1, я ожидаю, что он будет перебирать связанный список, начиная с позиции 1, который затем должен печатать: 6 5 7.

Однако, вместо этого, я получаю сообщение об ошибке, которое считывает

Exception in thread "main" java.lang.StackOverflowError 
    at Midterm.LinkedList.iterator(LinkedList.java:183) 

Я не могу понять, что я делаю неправильно. Мой вопрос в том, может ли кто-нибудь показать мне, как исправить мой метод public Iterator<E> iterator(int index), чтобы он повторялся через связанный список, начиная с позиции 1?

+3

'iterator (int)' вызывает 'iterator (int)' в своей первой строке. –

+1

... что приводит к бесконечной рекурсии – Thilo

+1

Вы получаете 'StackOverflowError', потому что' iterator' вызывает себя. Вы пишете собственный класс LinkedList или расширяете стандартный? –

ответ

2

Вы называете свой метод рекурсивно никогда не останавливаясь:

public Iterator<E> iterator(int index) { 
    Iterator<E> it = iterator(index); // calls this method again 

Так это будет просто позвонить iterator(int index) -> iterator(int index) -> iterator(int index) -> ... на неопределенный срок.

Это вызовет переполнение стека, поскольку размер стека ограничен.

+0

Где петля? –

+0

цикл не был правильным словом, это никогда не останавливает рекурсивный вызов (здесь нет русского языка, поэтому извините, если для этого есть термин). –

+0

Я слышал, что это называется бесконечной рекурсией *. –

1

Мне удалось получить мой метод итератора, чтобы вернуть итератор, который начинался с позиции индексной переменной со следующим кодом.

public Iterator<E> iterator(int index) { 
    Iterator<E> iterator = iterator(); 
    for (int i = 0; i < index && iterator.hasNext(); i++) { 
     iterator.next(); 
    } 
    return iterator; 
} 
Смежные вопросы