2015-02-19 3 views
0

Я пытаюсь использовать итератор, который реализует Iterator. Итератор должен пройти хэш-таблицу. Когда я пытаюсь распечатать элементы в хэш-таблице, я получаю бесконечный цикл где-то, и один и тот же элемент продолжает печататься до тех пор, пока я не закончу программу. Это мой код для моего hasNext и следующих методов (курсор отслеживает следующей активной ячейки в хэш-таблице, как таблица не будет заполнена в порядке, а активный означает, что ячейка в настоящее время занята):Iterator Infinite Loop - hasNext() и Next()

public boolean hasNext() 
    { 
     boolean entry = false; 
     //nextLoop: 
     while(entry == false && cursor < table.length) 
     { 
      if(table[cursor] == null) 
      { 
       cursor++; 
      } 
      else 
      { 
       if(table[cursor].active == false) 
       { 
        cursor++; 
       } 
       else 
       { 
        entry = true; 
        //break nextLoop; 
       } 
      } 
     } 
     boolean entryStatus = (table[cursor] != null); // check to see if entry at cursor is null 
     boolean activeStatus = table[cursor].active; // check to see if the cell is active (there is something inside the cell) 

     return (entryStatus && activeStatus); 
    } 

    public Object next() 
    { 
     boolean entry = false; 
     if(cursor >= table.length) 
     { 
      throw new NoSuchElementException(); //check - myexceptioN? 
     } 
     else 
     { 

      while(cursor < table.length && entry == false) 
      { 
       if(table[cursor] != null) 
       { 
        if(table[cursor].active == true) 
        { 
         entry = true; 
        } 
        else 
        { 
         cursor++; 
        } 
       } 
       else if(table[cursor] == null) 
       { 
        cursor++; 
       } 
      } 


     } 
     return table[cursor].element; 
    } 
+5

Вы пробовали пройти через отладчик? Какие линии никогда не достигаются? – Brandon

+4

Как правило, при реализации итератора вы сохраняете «указатель» на то, где находитесь в вашей коллекции (кажется, что «курсор» в вашем случае). 'hasNext()' должен просто вернуть, будет ли следующая позиция из вашего текущего указателя содержать достоверные данные и возвращать 'true/false'. Кажется, вы пересматриваете позицию курсора каждый раз, когда вы его вызываете, что довольно неэффективно. Когда вы вызываете 'next()', он должен фактически возвращать следующий элемент и увеличивать указатель. Эти два метода должны работать рука об руку, чтобы обеспечить функциональность итератора. –

+0

Почему вы не используете какую-либо реализацию java.util.map? –

ответ

0

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

Вам нужно переместить курсор в следующую позицию после получения значения в следующем методе.

0

Как пользователь Ryan J сказал в комментариях, вы должны работать рука об руку с вашими методами next() и hasNext(). И вам нужно увеличить курсор после вызова следующего.

public Object next() { 
     if (cursor >= table.length || table[cursor].active == true 
      || table[cursor] == null) { 
      throw new NoSuchElementException(); 
     } 

     return table[cursor++].element; 
    }