【问题标题】:set.iterator().......where am i wrong?set.iterator().......我哪里错了?
【发布时间】:2023-12-16 22:32:01
【问题描述】:

尝试实现一个 SET 接口并为联合方法使用迭代器。在 union 方法内部,它永远不会进入 while 循环。它不会从 union 方法具有的参数“set”中添加元素。 有任何想法吗? :)

打包链接集;

导入 java.util.Iterator; 导入 java.util.NoSuchElementException;

导入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;
}

}

【问题讨论】:

  • 调试器说什么?您目前如何调用此方法?我们看不到你的主要方法,所以它可能是集合是空的
  • 欢迎来到 Stack Overflow!看来您需要学习使用调试器。请帮助自己一些complementary debugging techniques。如果您之后仍有问题,请随时回来提供更多详细信息。

标签: java collections iterator set


【解决方案1】:

如果集合非空,LinkedSetIterator.hasNext() 方法将返回 false。这可以通过反转条件来纠正:

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

【讨论】:

  • 非常感谢,我还没有看到 :)