2016-11-05 7 views
0

Попытка реализовать интерфейс SET и использовать Итератор для метода объединения. Внутри метода объединения он никогда не входит в цикл while. Он не добавляет элементы из параметра «set», который имеет метод объединения. Любые идеи? :)set.iterator() ....... где я ошибаюсь?

package linkedSet;

импорт 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

Добро пожаловать в Stack Overflow! Похоже, вам нужно научиться использовать отладчик. Пожалуйста, помогите нам с некоторыми [дополнительными методами отладки] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Если у вас все еще есть проблемы после этого, пожалуйста, не забудьте вернуться с более подробной информацией. –

ответ

3

Метод LinkedSetIterator.hasNext() вернется false, если множество не пусто. Это можно было бы исправить с инвертированием условия:

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

Большое спасибо, я этого не видел :) –

Смежные вопросы