【问题标题】:Circular linked list and iterator循环链表和迭代器
【发布时间】:2016-02-11 06:14:04
【问题描述】:

我无法让我的迭代器实际工作并测试我的 add 和 next 方法。我想知道是否有人能指出我所缺少的。我已经研究了一段时间,似乎无法弄清楚如何正确初始化对象,一直说无法解析为类型。谢谢你 这是我的主要课程

public class CircularList<E> { 
private int size = 0;

//Inner Class
private static class Node<E>{
    private E data;
    private Node<E> next=null;
    private Node<E> previous=null;

    private Node(E dataItem) {
        data = dataItem;
    }
}


//Iterator
public class CircleIter implements ListIterator<E>{
    private Node<E> nextItem;
    private Node<E> lastItemReturned;
    private int index = 0;

public CircleIter(){
    nextItem=null;
    lastItemReturned=null;
}

@Override
public void add(E data) {
    Node<E> newNode = new Node<E>(data);
    if(index==0){
        newNode.next=newNode;
        newNode.previous=newNode;
        nextItem=newNode;
        lastItemReturned=newNode;
    }
    else{
        newNode.previous=nextItem.previous;
        nextItem.previous.next=newNode;
        newNode.next=nextItem;
        nextItem.previous=newNode;

    }
    index++;
    size++;
}

@Override
public boolean hasNext() {
    return nextItem != null;
}

@Override
public boolean hasPrevious() {
    return (lastItemReturned.next == null && size != 0)
            || lastItemReturned.previous != null;
}

@Override  //need to look over
public E next() {
   if (!hasNext()) {
        throw new NoSuchElementException();
   }
  lastItemReturned = nextItem;
  nextItem = nextItem.next;
  index++;
  return lastItemReturned.data;
}
@Override
public int nextIndex() {
    return index;
}

@Override //need to look over
public E previous() {
    nextItem=lastItemReturned;
    lastItemReturned=lastItemReturned.previous;
    index--;
    return nextItem.data;
}
@Override
public int previousIndex() {
    return index-1;
}

//remove last item returned through next&previous method
@Override
public void remove() {
      if (lastItemReturned == null) {
          throw new IllegalStateException();
        }
      nextItem.previous=lastItemReturned.previous;
      lastItemReturned.previous.next=nextItem;
      index--;
      size--;
      lastItemReturned = nextItem.previous;

}

@Override
public void set(E node) {
      if (lastItemReturned == null) {
          throw new IllegalStateException();
        }
        lastItemReturned.data = node;       
}

}  //end of iterator class

}

我的测试课

import CircularList.CircleIter;

public class CircularListTest {
public static void main(String[] args) {
    CircularList<Integer> intList = new CircularList<Integer>();

    CircleIter<Integer> iter= intList.CircleIter<Integer>();
    iter.add(5);


  }
}

【问题讨论】:

  • CircleIter 不能根据您的内部类定义进行参数化。因此您在测试类CircleIter&lt;Integer&gt; 中的声明无效。
  • 我尝试以CircleIter iter= intList.CircleIter(); 的身份离开,但仍然遇到同样的错误。

标签: java linked-list iterator


【解决方案1】:

如果你想创建CircularList.CircleIter 类的实例,你应该使用运算符“new”。
CircularList.CircleIter 是 CircularList 类的内部类(非静态嵌套类),所以为了创建新的实例你应该提供封闭类的实例special syntax:
CircularList&lt;Integer&gt;.CircleIter iter = intList.new CircleIter();
通常,集合会公开用于创建迭代器的特殊方法(例如,List 中的 iterator() 方法)以对消费者隐藏此语法。
正如 Alex Sou 之前提到的,只有封闭类在您的定义中被参数化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2016-03-02
    • 2016-07-08
    • 2015-02-08
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多