2016-09-29 5 views
0

クラスの割り当てのために、独自のイテレータをゼロから実装する必要があります。イテレータはリンクされたノードのリストを反復処理しています。イテレータを使用しているすべてのテストケースが失敗しており、何が間違っているのかわかりません。イテレータが動作しないのはなぜですか?

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(); 
    } 
} 

失敗するいくつかのテストケース(彼らはすべての戻りカウント= 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; 
    } 
} 
+3

おそらく失敗したテストケースの例を挙げることをお勧めします。 – javanut13

+0

デバッガの使い方を学ぶことをお勧めします。これは、一度に1行のコードを実行して変数の値を表示できるツールで、プログラムの動作が期待どおりに異なるかどうかを確認できます。 –

+0

残念ながら、私たちが簡単に手助けするための十分な情報を提供していない。あなたはテストケースが失敗したときに何が起こるか説明していません(5以外の数字を与えますか?それは例外をスローしますか?など)、問題を再現するのに十分なコードを提供していません(例えば、 LinkedSetのコードがあります)。私はいくつかの推測をすることができますが、適切な答えを出すためには、より多くのものを扱う必要があります。 – Tim

答えて

0

のためのコードです、あなたのadjoinメソッドです。

set1 = new LinkedSet<String>(); 

それはあなたがこのコンストラクタを呼び出すことを意味します:

// Constructors 
    public LinkedSet() { 
    } 

しかし、それはそのを持っているので、そのコンストラクタは、headには何も割り当てられませんが、このような新しいLinkedSetを構築

デフォルト初期値:

private LinkedNode<E> head = null; 

Sインスheadnullとしてオフ開始し、これまでに割り当てられていない、このメソッドは何もしませんでしたがthisを返す:あなたのセットはそれに何の関係もありませんので、

@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; 
} 

だからあなたのイテレータは、何を反復処理されていません。

+0

ありがとうございました非常に意味をなさない –

+0

問題はありませんが、答えが分かりやすい場合は、答えの先頭にある左側のチェックをクリックして「受け入れる」必要があります。 – Tim

0
  1. このコードは、currがnullの場合にNullPointerExceptionを保証します。

    実行が左右される(curr.getNext()== NULL || CURR == NULL)

場合。逆参照しようとする前に、nullの参照をテストします。

関連する問題