0

我编写了一个自定义迭代器类,它迭代在 PoSet 中找到的一组数字,这是我的代码:

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();
        }
    }

问题是在返回一个数字时,我应该遵守偏序规则,即: 1. 如果 (x, y) 属于R,那么 x 应该在 y 之前返回

但是,上面的代码似乎遵循该顺序,但它正在创建重复项,如何修复我的代码以不允许它?

注意:在我的代码中,S 是 PoSet 中的一组数字,它是一个 HashSet,R 是一个配对数组列表(配对:我创建的一个以 2 个整数作为参数的类)来保存 PoSet 中的关系。

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

4

1 回答 1

2

您的next方法总是调用i.next(),并返回以下两种情况之一:

  • i.next()返回的值
  • 一些小于该值的值。

这意味着如果您的poset包含{1,2,3,4}并使用整数的自然顺序并i.next()返回4,那么您现在返回4 (由于1、2和3已经返回),或者你永远不会返回 4 (因为它不小于任何未来值)。

您得到重复的原因是您为 的每个值返回一个值i.next(),并且有些值永远不会返回(参见上一段),因此自然有一些值会被多次返回作为补偿。请注意,您永远不会检查返回的值是否i.next()先前已由您的next()方法返回,因此如果poset中的一个元素不大于任何其他元素,那么当i.next()返回该元素时,您的next()方法将自动返回它,即使它已经之前退回的。

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

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

此外,您的for (Pair p : R)循环不会做您想做的事——n一旦发现任何小于n已返回的元素,它就会自动返回,即使还有其他小于n尚未返回的元素。(这是 ifR已经使用自己订购了。如果不是,那么这个循环有更大的问题。)

于 2012-03-23T12:25:44.197 回答