我在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似乎给我一个错误,告诉我我需要在循环外返回一个值,但我已经为每个案例返回内部为什么它需要更多? 感谢帮助
答案 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
),将它保存在其他地方并迭代它。
一般来说,我不确定这种方法会导致你想要什么。您对S
和R
中的元素顺序了解多少?如果迭代顺序是任意的(即因为关系是以不可预测的顺序添加的),那么迭代器将首先返回第一个关系对的前半部分,即使该元素在另一对的后半部分中。你有使用元素HashSet和关系List吗?