2014-11-15 3 views
0

Я пытаюсь создать Iterator, который работает для связанногоList. Я уже создал связанный список, который, как я думаю, должен работать хорошо, но теперь мне нужна помощь в создании итератора. Я пытаюсь сделать это быстрее, чем тот, который просто использовал бы getEntry() с циклом for, увеличиваясь на единицу каждый раз, потому что использование этого метода означает, что мне нужно пересечь связанный список для каждого элемента. Я пытаюсь решить это быстрее, чем это, но не знаю, с чего начать. Я знаю, что мне нужно создать следующий и метод hasnext, но не знаю, как это сделать. Также застрял в конструкторе и методах экземпляра.Создание итератора для связанного списка в java без использования getEntry

Вот код, который я до сих пор:

import java.util.NoSuchElementException; 


public class SListIterator<T> 
{ 
    private Node firstNode; 
    private int numberOfEntries; 

    public SListIterator() 
    { 
     firstNode = null; 
     numberOfEntries = 0; 
    } 

    public void addToFirst(T aData) 
    { 
     firstNode = new Node(aData, firstNode); 
     numberOfEntries++; 
    } 

    public T getEntry(int givenPosition) 
    { 
     T result = null; 

     if((givenPosition >= 1) && (givenPosition <= numberOfEntries)) 
     { 
      result = (getNodeAt(givenPosition)).data; 
     } 

     return result; 
    } 

    private Node getNodeAt(int givenPosition) 
    { 
     Node currentNode = firstNode; 

     for(int counter = 1; counter < givenPosition; counter++) 
     { 
      currentNode = currentNode.next; 
     } 

     return currentNode; 
    } 

    public Iterator<T> getIterator() 
    { 
     // TO DO   
    } 

    private class IteratorForSList implements Iterator<T> 
    { 
     // instance variable for IteratorForSList  


     private IteratorForSList() 
     { 
      // constructor 
     } 

     public boolean hasNext() 
     { 
      // need help 
     } 

     public T next() 
     { 
      // need help 
     } 

     public T remove() 
     { 
      throw new UnsupportedOperationException("remove() is not supported by this iterator"); 
     } 
    } 

    private class Node 
    { 
     private T data; 
     private Node next; 

     private Node(T aData, Node nextNode) 
     { 
      data = aData; 
      next = nextNode; 
     } 
    } 
} 

ответ

0

Почему не используется java.util.LinkedList? Он имеет метод итератора, который возвращает итератор.

import java.util.Iterator; 
import java.util.LinkedList; 


public class SListIterator{ 
    public static void main(String[] args){ 
     LinkedList<Integer> list = new LinkedList<Integer>(); 
     list.add(0); 
     list.add(1); 
     list.add(2); 
     list.add(3); 

     Iterator<Integer> iter = list.iterator(); 
     while(iter.hasNext()){ 
      System.out.println(iter.next()); 
     } 
    } 
} 
1

Ваш итератор должен знать только текущий узел в связанном списке:

public Iterator<T> getIterator() { 
    return new IteratorForSList(firstNode); 
} 

private class IteratorForSList implements Iterator<T> { 
    private Node currentNode; 

    private IteratorForSList(Node list) { 
    currentNode = list; 
    } 

    public boolean hasNext() { 
    return currentNode != null; 
    } 

    public T next() { 
    T result = currentNode.data; 
    currentNode = currentNode.next; 
    return result; 
    } 

    public void remove() { 
    throw new UnsupportedOperationException(
     "remove() is not supported by this iterator"); 
    } 
} 
Смежные вопросы