Java Реализация Deque не может преобразовать элемент - PullRequest
0 голосов
/ 06 января 2020

Реализация Deque Я реализовал обобщенную c структуру данных Deque.

Пожалуйста, просмотрите эту реализацию

, и ошибка не имеет смысла для меня, пожалуйста, сообщите мне немного

import java.util.NoSuchElementException;
import java.util.Iterator;
public class Deque<Item> implements Iterable<Item> 
{
   private int n;
   private Node first;
   private Node last;
   private class Node
   {
      private Item item;
      private Node next;
   }
   private class ListIterator implements Iterable<Item>
   {
      private Node<Item> current = first;
      public boolean hasNext()
      {
         return current != null;
      }
      public Item next()
      {
         if(!hasNext())
         {
            throw new NoSuchElementException("Deque underflow");
         }
         Item item = current.item;
         current = current.next;
         return item;
      }
      public void remove()
      {
         throw new UnsupportedOperationException();
      }
   }
   public Iterator<Item> iterator()
   {
      return new ListIterator();
   }
   public Deque()
   {
      n = 0;
      first = null;
      last = null;
   }

   // is the deque empty?
   public boolean isEmpty()
   {
      return n ==0;
   }

   // return the number of items on the deque
   public int size()
   {
      return n ;
   }

   // add the item to the front
   public void addFirst(Item item)
   {
      if(item == null)
      {
         throw new IllegalArgumentException();
      }
      Node oldNode = first;
      Node newNode = new Node();
      newNode.item = item;
      if(oldNode == null)
      {
         last = newNode;
      }
      else
      {
         newNode.next = oldNode;
      }
      first = newNode;
      n++;
   }

   // add the item to the back
   public void addLast(Item item)
   {
      if(item == null)
      {
         throw new IllegalArgumentException();
      }
      Node oldNode = last;
      Node newNode = new Node();
      newNode.item = item;
      if(oldNode == null)
      {
         first = newNode;
      }
      else
      {
         oldNode.next = newNode;
      }
      last = newNode;
      n++;
   }

   // remove and return the item from the front
   public Item removeFirst()
   {
      if(isEmpty())
      {
         throw new NoSuchElementException("Deque underflow");
      }
      Item item = first.item;
      first = first.next;
      n--;
      if(isEmpty())
      {
         first=null;
      }
      return item;
   }

   // remove and return the item from the back
   public Item removeLast()
   {
      if(isEmpty())
      {
         throw new NoSuchElementException("Deque underflow");
      }
      Node secondLast = first;
      if(n>3)
      {
         while(secondLast.next.next != null)
         {
            secondLast = secondLast.next;
         }
      }
      else 
      {
         secondLast = first;
      }
      Item item = last.item;
      last = secondLast;
      n--;
      if(isEmpty())
      {
         last = null;
      }
      return item;
   }
}

Тестовый файл

import java.util.Iterator;

public class dequeTest
{
   public static void main(String[] args)
   {
      Deque<Double> d = new Deque<Double>();
      System.out.println("Empty? "+d.isEmpty()+" \tSize is "+ d.size());
      d.addFirst(2.0);
      System.out.println(d.removeFirst());
      System.out.println("Empty? "+d.isEmpty()+" \tSize is "+ d.size());
      d.addFirst(1.2);
      System.out.println(d.removeLast());
      System.out.println("Empty? "+d.isEmpty()+" \tSize is "+ d.size());
      d.addLast(1.4);
      System.out.println("Empty? "+d.isEmpty()+" \tSize is "+ d.size());
      for(int i = 0;i<10;i++)
      {
         d.addLast((double)i);
      }
      for(double value: d)
      {
         System.out.print(value);
      }   
   }
}

Ошибка Несоответствие типов: невозможно преобразовать Deque.ListIterator в Iterator

Может кто-нибудь помочь с ошибкой? и исправить, если у вас есть идея получше

1 Ответ

1 голос
/ 06 января 2020

Iterable<T> не является Iterator<T>, но у него есть метод для получения Iterator<T>. Просто измените

public Iterator<Item> iterator()
{
   return new ListIterator();
}

на

public Iterator<Item> iterator()
{
   return new ListIterator().iterator();
}

и далее, я бы предложил вам использовать ArrayDeque (или даже LinkedList), когда вам нужно Deque. Похоже, что ваша реализация не улучшает и не ухудшает тени вашего имени класса java.util.Deque интерфейс (который вы не реализует ). Наконец, Deque должно быть Collection (не просто Iterable).

...