2016-11-05 2 views
0

SETインターフェイスを実装しようとしていて、ユニオンメソッドにIteratorを使用しようとしています。 unionメソッドの中ではwhileループに入ることはありません。 unionメソッドが持つパラメータ "set"の要素は追加されません。 アイデア:)set.iterator().......どこが間違っていますか?

パッケージリンクセット;

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

import linkedList.LinearNode;

LinkedSetがセットが空でない場合SetADT {

private int size; 
private LinearNode<T> front; 
private boolean allowNullElement = false; 

// ///////////////////////////////////////////////////// 
private class LinkedSetIterator implements Iterator<T> { 

    private LinearNode<T> currentNode; 

    public LinkedSetIterator() { 
     currentNode = front; 
    } 

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

    @Override 
    public T next() { 
     if (!hasNext()) { 
      throw new NoSuchElementException(); 
     } 
     T temp = currentNode.getElement(); 
     currentNode = currentNode.getNext(); 
     return temp; 
    } 
} 
/////////////////////////////////////////////////// 
@Override 
public Iterator<T> iterator() { 
    return new LinkedSetIterator(); 

} 
public LinkedSet(boolean allowNullElement) { 
    size = 0; 
    front = new LinearNode<T>(); 
    this.allowNullElement = allowNullElement; 
} 

public String toString() { 

    String str = "{"; 
    for (int i = 0; i < size; i++) { 
     str += getNode(i).getElement(); 
     if (i < size - 1) { 
      str += (", "); 
     } 
    } 
    return str + "}"; 

} 

private LinearNode<T> getNode(int index) { 
    LinearNode<T> current = front; 
    for (int i = 0; i < index; i++) { 
     current = current.getNext(); 
    } 
    return current; 
} 

@Override 
public void add(T element) { 
    if (element == null && !allowNullElement) { 
     throw new IllegalArgumentException(
       "Null element is not allowed to add"); 
    } 
    front = new LinearNode<T>(element, front); 
    size++; 

} 

@Override 
public T remove(T element) { 

    if (!(contains(element))) { 
     throw new IllegalStateException(); 
    } 
    T temp = null; 
    ; 
    for (int i = 0; i < size; i++) { 

     temp = getNode(i).getElement(); 
     if (temp.equals(element) || temp == element) { 
      if (i == 0) { 
       front = front.getNext(); 
       break; 

      } else { 
       getNode(i).setElement(front.getElement()); 
       front = front.getNext(); 
       break; 
      } 
     } 
    } 
    size--; 
    return temp; 
} 

@Override 
public boolean contains(T element) { 
    for (int i = 0; i < size; i++) { 
     if (getNode(i).getElement() != null 
       && getNode(i).getElement().equals(element)) { 
      return true; 
     } 
     if (getNode(i).getElement() == null 
       && getNode(i).getElement() == element) { 
      return true; 
     } 
    } 
    return false; 
} 

@Override 
public boolean isEmpty() { 

    return size == 0; 
} 

@Override 
public int size() { 
    return size; 
} 

@Override 
public boolean isSubset(SetADT<T> set) { 
    if (set == null) { 
     throw new IllegalArgumentException(); 
    } 

    for (int i = 0; i < size; i++) { 
     T temp = getNode(i).getElement(); 
     if (!(set.contains(temp))) { 
      return false; 
     } 
    } 
    return true; 
} 

@Override 
public SetADT<T> intersection(SetADT<T> set) { 
    if (set == null) { 
     throw new IllegalArgumentException(); 
    } 
    LinkedSet<T> temp = new LinkedSet<T>(allowNullElement); 

    for (int i = 0; i < size; i++) { 

     if (set.contains(getNode(i).getElement())) { 
      temp.add(getNode(i).getElement()); 
     } 
    } 
    return temp; 
} 

public SetADT<T> union(SetADT<T> set) { 

    if (set == null) { 
     throw new IllegalArgumentException(); 
    } 

    LinkedSet<T> temp = new LinkedSet<T>(allowNullElement); 
    LinearNode<T> node = front; 

    for (int i = 0; i < size; i++) { 
     T el = node.getElement(); 
     temp.add(el); 
     node = node.getNext(); 
    } 

    Iterator<T> iterator = set.iterator(); 
    while (iterator.hasNext()) { 
     temp.add(iterator.next()); 

    } 
    return temp; 
} 

}

+0

デバッガーとは何ですか?どのように現在このメソッドを呼び出していますか?私たちはあなたのメインメソッドを見ることができないので、セットが空である可能性があります –

+0

ようこそスタックオーバーフロー!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、もう少し詳しくお聞かせください。 –

答えて

3

LinkedSetIterator.hasNext()方法はfalseが返される実装パブリッククラス。これは条件を反転することで修正できます:

@Override 
public boolean hasNext() { 
    return currentNode != null; 
} 
+0

ありがとう、私はそれを見ていない:) –

関連する問題