анонимный интерфейс внутреннего класса

У меня есть этот класс LinkedListDouble, который имеет метод public ListIterator<T>listIterator(), и я пытаюсь выполнить интерфейс ListIterator как анонимный внутренний класс, правильно ли я иду? Что мне делать, чтобы public int nextIndex()/public int previousIndex() работал? Метод nextIndex возвращает индекс элемента, который будет возвращен последующим вызовом next, или размер списка, если итератор списка находится в конце списка, а метод previousIndex возвращает индекс элемента, который будет возвращен последующим вызовом. вызов предыдущего или -1, если итератор списка находится в начале списка как сказано здесь

вот класс LinkedListDouble

public class LinkedListDouble <T>  {
 private Node first = null;
 private Node last = null;

 public LinkedListDouble ()         // constructor
 {
    first = null;                  // no items on list yet
    last = null;

 }

 public void add(T item) {
     Node newNode = new Node(item);
        if (isEmpty()) {
            first =newNode;
            last = newNode;

        }  
        else {
            //first.setPrev(newNode); 
            //newNode.setNext(first); 
            //first = newNode;

            last.setNext(newNode);
            newNode.setPrev(last);
            last=newNode;
        }
    }
    public boolean contains(T item){
        if(first==null)
            return false;
        else
        {
            Node newNode=first;
            while(newNode!=null)
            {
                if(newNode.getInfo().equals(item))
                    return true;
                else
                    newNode=newNode.getNext();
            }
        }
        return false; 
 }

   public T remove(T item)
    {//get care of first and last nodes
       //and if there is more than 1 matching
        boolean check=contains(item);
        if(check==true)

        {
            Node newNode=first;
            while(newNode!=null)
            {
                if(newNode.getInfo().equals(item))
                {
                    newNode.getPrev().setNext(newNode.getNext());
                    newNode.getNext().setPrev(newNode.getPrev());
                    return item;
                }
                else
                    newNode=newNode.getNext();
            }

        }
        return null;

    }

   public int size()
   {
       int size=0;
       if(first==null)
           return size;
       else
       {

        Node newNode=first;
        while(newNode!=null)
        {
            size++;
            newNode=newNode.getNext();

        }

       }
       return size;
   }

   public String toString()
   {
    Node newNode=first;
    String s="";
    while(newNode!=null)
    {
        s+=newNode.getInfo()+" ,";
        newNode=newNode.getNext();
    }
    return s;

   }

 public boolean isEmpty() {
        return first == null;
    }

и вот метод, который должен выполнять интерфейс ListIterator как анонимный внутренний класс, и то, что я пытался сделать до сих пор:

public ListIterator<T>listIterator() 
 {
     ListIterator<T>listIterator = new ListIterator<T>() {
     private Node current = first;
     private Node temp2 = null;
     private int curindex = 0;

    @Override
    public void add(T e) {
        // TODO Auto-generated method stub
        throw new RuntimeException();
    }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        boolean flag=true;
        if(current.getNext()==null)
        {
            flag=false;
        }
        return flag;
    }

    @Override
    public boolean hasPrevious() {
        // TODO Auto-generated method stub
        boolean flag=true;
        if(current.getPrev()==null)
        {
            flag=false;
        }
        return flag;
    }

    @Override
    public T next() {
        // TODO Auto-generated method stub
         if (!hasNext()) throw new NoSuchElementException();


         temp2=current.getNext();
          current=current.getNext();
          return (T) temp2.getInfo();



    }

    @Override
    public int nextIndex() {
        // TODO Auto-generated method stub
        int counter=0;
        if(!hasNext()) return size();
        return curindex;


    }

    @Override
    public T previous() {
        // TODO Auto-generated method stub
         if (!hasPrevious()) throw new NoSuchElementException();

         temp2 = current.getPrev();
         temp2 = temp2.getPrev();


          return (T) temp2.getInfo();
    }

    @Override
    public int previousIndex() {
        // TODO Auto-generated method stub
        int counter=0;
        if(!hasPrevious()) return -1;
        return curindex-1;
    }

    @Override
    public void remove() {
        // TODO Auto-generated method stub
        throw new RuntimeException();
    }

    @Override
    public void set(T e) {
        // TODO Auto-generated method stub
        throw new RuntimeException();
    } 


     };
     return listIterator;
 }

person Liana    schedule 04.01.2017    source источник


Ответы (1)


Это пример кода из метода listIterator() в LinkedList:

public E next() {
    //check for modification
    if (!hasNext())
        throw new NoSuchElementException();
    lastReturned = next;
    next = next.next;
    nextIndex++;
    return lastReturned.item;
}


public E previous() {
    //check for modification
    if (!hasPrevious())
        throw new NoSuchElementException();
    lastReturned = next = (next == null) ? last : next.prev;
    nextIndex--;
    return lastReturned.item;
}

public int nextIndex() {
    return nextIndex;
}

public int previousIndex() {
    return nextIndex - 1;
}

Как видите, вам нужно сохранить переменную типа index, чтобы отслеживать следующий индекс.

Следующий индекс увеличивается/уменьшается внутри методов next() и previous(), и эти методы уже обрабатывают проблему размера списка, поэтому не нужно беспокоиться о проблеме размера в методах nextIndex() и previousIndex().

person Ankush G    schedule 04.01.2017