首页 > 解决方案 > 为数组列表实现迭代器

问题描述

我有一个实例列表,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;
}


}

有没有什么办法解决这一问题?或者对如何使用我必须这样做的领域有任何想法?

标签: javaiterator

解决方案


据我了解,主要问题是递增值的初始化,每次调用next().

要解决这样的问题,您可以通过简单地调用来访问列表的最后一个条目primes.get(primes.size() - 1)。当然,这可能会导致IndexOutOfBoundsException如果它是空的,因此您必须先进行一些检查,例如:

Integer num = primes.isEmpty() ? Integer.valueOf( 1 ) : primes.get( primes.size() - 1 );
num++;

另请注意,返回的数字应该是最后一个素数,因此我们必须在执行其余例程之前将其递增一次。否则将返回相同的值,您将一无所获。

事实上,我们可以通过将 while-loop 转换为 do-while-loop 来轻松解决递增一次的问题:

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

推荐阅读