为什么我的迭代器不工作?

时间:2016-09-29 01:28:38

标签: java iterator

对于类赋值,我必须从头开始实现自己的迭代器。迭代器迭代通过链接的节点列表。我使用迭代器的所有测试用例都失败了,我不知道它有什么问题。

import java.util.Iterator;
import java.util.NoSuchElementException;

class LinkedNodeIterator<E> implements Iterator<E> {
    LinkedNode<E> headNode;
    LinkedNode<E> curr;


  // Constructors
  public LinkedNodeIterator(LinkedNode<E> head) {
      headNode = head;
      curr = headNode;      
  }

  @Override
  public boolean hasNext() {
      if(headNode == null)
          return false;
      if(curr.getNext() == null)
          return false;
      return true;
  }

  @Override
  public E next() {
    if(curr.getNext() == null || curr == null)
    throw new NoSuchElementException();
        LinkedNode<E> save = curr;
        curr = curr.getNext();
        return save.getData();

  }


  @Override
  public void remove() {
    throw new UnsupportedOperationException();
  }
}

一些失败的测试用例(它们都返回count = 0):

public class PublicLinkedSetTest {
  Set<String> set0;
  Set<String> set1;
  Set<String> set2;
  Set<String> set3;
  Set<String> set4;


 @Before
  public void before() {
    set0 = new LinkedSet<String>();
    set1 = new LinkedSet<String>();
    for (String e : new String[]{"c", "a", "d", "b", "e"}) {
      set1 = set1.adjoin(e);
    }
    set2 = new LinkedSet<String>();
    for (String e : new String[]{"b", "d", "a", "e", "c"}) {
      set2 = set2.adjoin(e);
    }
    set3 = new LinkedSet<String>();
    for (String e : new String[]{"a", "d", "b"}) {
      set3 = set3.adjoin(e);
    }
    set4 = new LinkedSet<String>();
    for (String e : new String[]{"x", "y", "z", "a", "b", "d"}) {
      set4 = set4.adjoin(e);
    }
  }

     public void testIterator1() {
    int count = 0;
    for (String e : set1) {
      count += 1;
    }
    assertEquals(5, count);
  }

  @Test

  public void testIterator2() {
    int count = 0;
    for (String e : set2) {
      count += 1;
    }
    assertEquals(5, count);
  }

  @Test

  public void testIterator3() {
    int count = 0;
    for (String e : set3) {
      count++;
    }
    assertEquals(3, count);
  }

这是我的LinkedSet的代码

import java.util.Iterator;

public class LinkedSet<E> implements Set<E> {
  private LinkedNode<E> head = null;
  private LinkedNode<E> link;

  // Constructors
  public LinkedSet() {
  }

  public LinkedSet(E e) {
    this.head = new LinkedNode<E>(e, null);
  }

  private LinkedSet(LinkedNode<E> header) {
    header = head;

  }

  @Override
  public int size() {
      int count = 0;
     for(E e : this){
        count++;}
    return count;
  }

  @Override
  public boolean isEmpty() {
    for(E e : this){
        if(e != null)
            return false;
    }
        return true;
  }

  @Override
  public LinkedNodeIterator<E> iterator() {
    return new LinkedNodeIterator<E>(this.head);
  }

  @Override
  public boolean contains(Object o) {
  for(E e : this){
      if(e == o)
          return true;
  }
    return false;
  }

  @Override
  public boolean isSubset(Set<E> that) {
      that = new LinkedSet<E>();
      if(this.size()>that.size())
          return false;
    for(E e : this){
        if(that.contains(e) == false)
            return false;
    }
    return true;
  }

  @Override
  public boolean isSuperset(Set<E> that) {
   that = new LinkedSet<E>();
   if(this.isSubset(that))
    return true;
   else
       return false;
  }

  @Override
  public Set<E> adjoin(E e) {
      boolean alwaysEqual = true;
      if(this.head == null)
          return this;
    for(E t : this){
        if(t != e)
            alwaysEqual = false;}
    if(alwaysEqual == true)
        return this;
    LinkedNode<E> temp = this.head;
   LinkedNode<E> newNode = new LinkedNode<E>(e, temp);
   LinkedSet<E> newSet = new LinkedSet<E>(newNode);
   Set<E> otherSet = newSet;

    return otherSet;
  }

  @Override
  public Set<E> union(Set<E> that) {
      Set<E> thisSet = this;
    for(E e : that){
        if(!this.contains(e))
            thisSet = thisSet.adjoin(e);

    }

    return thisSet;
  }

  @Override
  public Set<E> intersect(Set<E> that) {
      LinkedSet<E> newSet = null;
      Set<E> otherNewSet = newSet;
    for(E e : that){
        if(this.contains(e)){
            if(otherNewSet == null){
                LinkedNode<E> newNode = new LinkedNode<E>(e, null);
                otherNewSet = new LinkedSet<E>(newNode);
            }
            else{

                otherNewSet = otherNewSet.adjoin(e);
            }

        }
    }

    return otherNewSet;
  }

  @Override
  public Set<E> subtract(Set<E> that) {
    LinkedSet<E> newSet = null;
    Set<E> otherNewSet = newSet;
    for(E e : that){
        if(!this.contains(e)){
            if(otherNewSet == null){
                LinkedNode<E> newNode = new LinkedNode<E>(e, null);
                otherNewSet = new LinkedSet<E>(newNode);
            }
            else{

                otherNewSet = otherNewSet.adjoin(e);
            }

        }
    }

    return otherNewSet;
        }

  @Override
  public Set<E> remove(E e) {
      LinkedSet<E> newSet = null;
        Set<E> otherNewSet = newSet;
    if(!this.contains(e))
    return this;
    else{
        for(E t : this){
            if(t != e){
                if(otherNewSet == null){
                    LinkedNode<E> newNode = new LinkedNode<E>(e, null);
                    otherNewSet = new LinkedSet<E>(newNode);
                }
            }
                else{

                    otherNewSet = otherNewSet.adjoin(e);
                }
        }
    }
    return otherNewSet;
  }

  @Override
  @SuppressWarnings("unchecked")
  public boolean equals(Object o) {
    if (! (o instanceof Set)) {
      return false;
    }
    Set<E> that = (Set<E>)o;
    return this.isSubset(that) && that.isSubset(this);
  }

  @Override
    public int hashCode() {
    int result = 0;
    for (E e : this) {
      result += e.hashCode();
    }
    return result;
  }
}

2 个答案:

答案 0 :(得分:0)

问题不在于您的迭代器,而是您的 Dim builder As New StringBuilder builder.Append("<!DOCTYPE html><html>") builder.Append("<head>") builder.Append("</head>") builder.Append("<body>") builder.Append("<table>") builder.Append("</table>") builder.Append("<body>") 方法。

当您构建一个新的adjoin时:

LinkedSet

这意味着你调用这个构造函数:

 set1 = new LinkedSet<String>();

但是该构造函数没有为 // Constructors public LinkedSet() { } 分配任何内容,因此它具有默认的初始值:

head

由于 private LinkedNode<E> head = null; head开头,并且未被分配,此方法永远不会做任何事情,只会返回null

this

所以你的迭代器不会迭代任何东西,因为你的集合中没有任何东西。

答案 1 :(得分:0)

  1. 如果curr为null,则代码保证NullPointerException。

    if(curr.getNext()== null || curr == null)

  2. 执行是从左到右。在尝试取消引用之前测试null的引用。