我很难为我的TupleHashSet类实现一个Iterator。hashArr属性存储我的元组(对)对象的哈希集。insert方法根据计算的HashCode插入元组。
问题是,如果我用方法插入某些内容,迭代器就不会遍历整个HashArr。
我的老师告诉我一个提示,我的方法是错误的,因为HashSet值对顺序不感兴趣。不过,我不知道他这么说是什么意思。
TupleSet
public class TupleSet<T, S> implements Iterable<Tuple<T, S>> {
private final Tuple<T, S>[] hashArr;
public static final int SS = 999;
public TupleHashSet() {
hashArr = new Tuple[SS];
}
@Override
public java.util.Iterator<Tuple<T, S>> iterator() {
return new Iterator(hashArr);
}
class Iterator implements java.util.Iterator<Tuple<T, S>> {
private Tuple<T, S>[] array;
private int index = 0;
Iterator(Tuple<T, S>[] t) {
this.array = t;
}
@Override
public boolean hasNext() {
for (int i = index; i < SIZE; ++i) {
if (array[i] != null) {
return true;
}
}
return false;
}
@Override
public Tuple<T, S> next() {
for (int i = index; i < SIZE; ++i) {
if (hashArr[i] != null) {
index = i + 1;
return hashArr[i];
}
}
throw new NoSuchElementException();
}
}
发布于 2022-01-09 08:50:49
这个答案解决了您关于迭代器没有返回所有项的问题。
数组索引永远不会增加,因此它总是在索引1
(即index + 1
)处返回项。在返回之前,index
必须在对next
的调用中递增,以便下一次调用从后台数组中的后续元素开始。
而且,支持数组并不密集(这意味着在任意位置可能有空槽,这是可以的),因此next
函数必须找到下一个有效条目,而不是在下一个条目为空(即null
)时放弃。
试一试:
@Override
public Iterator<Tuple<T, S>> iterator() {
Iterator<Tuple<T, S>> it = new Iterator<Tuple<T, S>>() {
private int index = 0;
@Override
public boolean hasNext() {
for (int i = index; i < SIZE; ++i) {
if (hashArr[i] != null) {
return true;
}
}
return false;
}
@Override
public Tuple<T, S> next() {
for (int i = index; i < SIZE; ++i)
if (hashArr[i] != null) {
index = i + 1;
return hashArr[i];
}
}
throw new NoSuchElementException();
}
};
return it;
}
发布于 2022-01-09 09:59:47
这是一个可能的解决方案。
public boolean hasNext() {
for(; index < SIZE && hashArr[index] == null; index++);
return index < SIZE;
}
https://stackoverflow.com/questions/70643448
复制相似问题