Java 偏序集迭代实现的正确性

Java 偏序集迭代实现的正确性,java,arraylist,iterator,set,poset,Java,Arraylist,Iterator,Set,Poset,我编写了一个自定义迭代器类,它迭代在偏序集中找到的一组数字,下面是我的代码: private class IntGenerator implements Iterator { private Iterator<Integer> i; private Set<Integer> returnedNumbers; public IntGenerator () { returnedNumbers = ne

我编写了一个自定义迭代器类,它迭代在偏序集中找到的一组数字,下面是我的代码:

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


        public IntGenerator () {
            returnedNumbers = new HashSet<Integer> ();
            i = S.iterator();
        }

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

        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 if (isInFirstElmPair(p, n)){
                    returnedNumbers.add(n);
                    return n;
                }
            }
            return n;
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
私有类IntGenerator实现迭代器{
私有迭代器i;
私人设置返回号码;
公共IntGenerator(){
returnedNumbers=newhashset();
i=S.iterator();
}
公共布尔hasNext(){
return i.hasNext();
}
公共对象下一个(){
int n=i.next();
用于(p:R对){
if(isinsecondelpair(p,n)){
if(returnedNumbers.contains(p.getFirstElm())){
返回的数字。添加(n);
返回n;
}否则{
returnedNumbers.add(p.getFirstElm());
返回p.getFirstElm();
}
}else if(isInFirstElmPair(p,n)){
返回的数字。添加(n);
返回n;
}
}
返回n;
}
公共空间删除(){
抛出新的UnsupportedOperationException();
}
}
问题是,在返回数字时,我应该遵守偏序规则,即: 1.如果(x,y)属于
R
,那么x应该在y之前返回

然而,上面的代码似乎遵循这个顺序,但它正在创建重复的代码,我如何修复我的代码以不允许它

注意:在我的代码中,S是偏序集中的一组数字,它是一个HashSet,R是一个pairs数组列表(pair:我创建的一个类,它以2个int作为参数)来保存偏序集中的关系

有没有办法解决这个问题?
谢谢

您的
next
方法始终调用
i.next()
,并返回以下两项之一:

  • i.next()
    返回的值
  • 一些小于该值的值
这意味着,如果您的偏序集包含{1,2,3,4}并使用整数的自然顺序,并且
i.next()
返回4,那么您要么现在返回4(因为已经返回了1、2和3),要么永远不会返回4(因为它不小于任何未来的值)

获取重复项的原因是,对于
i.next()
的每个值,您都会返回一个值,并且有些值永远不会返回(请参见上一段),因此自然会有一些值在补偿中多次返回。请注意,您从不检查从
i.next()
返回的值以前是否由
next()
方法返回,因此如果偏序集中的某个元素不大于任何其他元素,那么当
i.next()
返回该元素时,您的
next()
方法将自动返回该元素,即使它之前已经归还了它

我认为唯一明智的解决办法是彻底改变你的方法;我认为你目前的方法很难奏效。我认为迭代器的构造函数需要将偏序集的所有元素复制到一个可接受的有序列表中,然后
next()
方法将简单地返回该列表的下一个元素。或者,由于您当前的方法已经要求在每次调用
next()
时迭代
R
,因此将迭代器基于
R
上的迭代器可能更有意义。(我在这里假设,
R
已经使用自身进行了排序;如果没有,则您的
for
循环毫无意义,基本上会返回随机选择的元素。)

如果您确实想坚持您的方法,那么您不仅需要跟踪
next()
方法返回的元素,还需要跟踪
i.next()
返回但
next()
方法未返回的元素;稍后您需要能够返回这些元素

另外,您的
for(Pair p:R)
循环并没有执行您想要的操作-它会在找到任何已返回的小于
n
的元素时自动返回
n
,即使还有其他小于
n
的元素尚未返回。(这是因为
R
已经使用自身进行了排序。如果没有,则此循环存在更大的问题。)