对于部分有序集合的Poset迭代顺序/自定义迭代器实现

时间:2012-03-22 22:46:55

标签: java iterator poset

我在java中创建一个部分有序的集合作为抽象数据类型,我必须创建一组数字的迭代器版本,以及关系的迭代器。现在对于元素,我使用了整数的HashSet,对于关系,我使用了一对ArrayList(对象是我创建的一个类,它以2个int作为参数,基本上就像(x,y))。我需要制作2个迭代器,一个用于s,一个用于r,但它们必须遵循一定的顺序, 1. if(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似乎给我一个错误,告诉我我需要在循环外返回一个值,但我已经为每个案例返回内部为什么它需要更多? 感谢帮助

1 个答案:

答案 0 :(得分: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
    }
}

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

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