1

我正在创建一个偏序集作为 java 中的抽象数据类型,我必须制作数字集的迭代器版本,以及关系的迭代器。现在对于元素,我使用了整数的 HashSet,对于关系,我使用了对的 ArrayList(对是我创建的一个类,它采用 2 个整数作为参数,基本上类似于 (x, y))。我需要创建 2 个迭代器,一个用于 s,一个用于 r,但它们必须遵循一定的顺序,1. 如果 (x, y) 属于R,那么 s 的迭代器应该在返回 y 之前返回 x 2. 如果(x, y) 和 (y, z) 属于R,那么 r 的迭代器应该在返回 (y, z) 之前返回 (x, y)

我做了一个辅助方法,首先检查集合中的元素 n 是否是一对中的第一个元素,然后返回它,但我似乎无法检查它是否是第二个元素,我该如何检查第一个元素如果它被退回或没有?

这是我的代码:

private class IntGenerator implements Iterator {
        private Iterator<Integer> i;


        public IntGenerator () {
            i = S.iterator();
        }

        public boolean hasNext() {
            return i.hasNext();
        }

        public Object next() {
            int n = i.next();

            for (Pair p : R) {
                if (isInFirstElmPair(p,  n)) return n;
                else (isInSecondElmPair(p, n)) {
                                    // should check for the first element
                                    // if it was returned or not
                }
            }
        }

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

我真的很感激任何形式的帮助,或在这段代码中提示。谢谢

编辑:

好的,在添加一个包含返回元素的新集合后,我已经编写了代码,这就是我写的:

Set<Integer> returnedNumbers = new HashSet<Integer> ();
public Object next() {
            int n = i.next();

            for (Pair p : R) {
                if (isInSecondElmPair(p, n)) {
                    if (returnedNumbers.contains(p.getFirstElm())) {
                        returnedNumbers.add(n);
                        return n;
                    }else{
                        returnedNumbers.add(p.getFirstElm());
                        return p.getFirstElm();
                    }
                }else{
                    returnedNumbers.add(n);
                    return n;
                }
            }
        }

这段代码正确吗?另外,eclipse似乎给了我一个错误,告诉我我需要在循环外返回一个值,但是我已经在每种情况下都返回了内部,为什么还需要更多?感谢帮助

4

1 回答 1

1

好吧,要检查以前是否返回了值,您当然需要跟踪以前返回的所有值。

所以在你的迭代器中,你可以定义

Set<Integer> previouslyReturned = new HashSet<Integer>();

然后,在你的 for 循环中返回它之前,将它添加到那里:

if (isInFirstElmPair(p,  n)) {
    previouslyReturned.add(n);
    return n;
}
else (isInSecondElmPair(p, n)) {
    if (previouslyReturned.contains(n) {
        // do one thing
    } else {
        // do another thing
    }
}

但是,这样,您将按照在iterator中返回的顺序构造一组 s 。LinkedHashSet创建一次(考虑 a ),将它保存在其他地方并迭代它是有意义的。

一般来说,我不确定这种方法会导致你想要什么。你对Sand中的元素顺序有什么了解R吗?如果迭代顺序是任意的(即因为关系是以不可预测的顺序添加的),那么迭代器将首先返回第一个关系对的前半部分,即使该元素位于另一对关系的后半部分。您必须使用元素 HashSet 和关系列表吗?

于 2012-03-22T23:05:47.443 回答