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()
- 一些小于该值的值
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
已经使用自身进行了排序。如果没有,则此循环存在更大的问题。)