我有一个实例列表DynamicArray
,它几乎是一个数组列表,
在这里我尝试实现一个迭代器:
问题是我不允许添加任何字段,因此没有索引字段...并且我正在尝试为迭代器编写方法 next()
来返回下一个素数,我认为将其添加到数组中也许是个好主意。
但是每次我调用 next 时,它都会将 num 设置为 2,然后它不会增加,所以最终它只会返回 2..
import java.util.Iterator;
public class PrimeIterator implements Iterator<Integer> {
private List<Integer> primes;
//Complete the following method
public PrimeIterator(){
this.primes = new DynamicArray<Integer>();
}
//Complete the following method
public boolean hasNext(){
return false;
}
//Complete the following method
public Integer next(){
Integer num = new Integer(2);
while(!isPrime(num)){
num++;
}
primes.add(num);
return num;
}
public boolean isPrime (Integer num){
for(int i = 2; i*i<=num; i++){
if(num%i == 0) return false;
}
return true;
}
//DO NOT REMOVE OR CHANGE THIS MEHTOD – IT IS REQUIRED
public void remove() {
return;
}
}
有什么办法可以解决这个问题吗?或者知道如何使用我必须做到的领域?
最佳答案
据我了解,主要问题在于增量值的初始化,每次调用 next()
时该值都会重置为 2。
要解决此类问题,您只需调用 primes.get(primes.size() - 1)
即可访问列表的最后一个条目。当然,如果它为空,这可能会导致 IndexOutOfBoundsException
,因此您必须在之前进行一些检查,例如:
Integer num = primes.isEmpty() ? Integer.valueOf( 1 ) : primes.get( primes.size() - 1 );
num++;
另请注意,返回的数字应该是最后一个质数,因此我们必须在执行其余例程之前将其递增一次。否则,将返回相同的值,而您将一无所获。
事实上,我们可以通过将 while 循环转换为 do-while 循环来轻松解决增量一次的问题:
public Integer next()
{
int num = primes.isEmpty() ? 1 : primes.get( primes.size() - 1 ).intValue();
do
{
num++;
}
while ( !isPrime( num ) );
Integer primer = Integer.valueOf( num );
primes.add( primer);
return primer;
}
关于java - 为数组列表实现迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54006742/