java - 为数组列表实现迭代器
问题描述
我有一个实例列表,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()
.
要解决这样的问题,您可以通过简单地调用来访问列表的最后一个条目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;
}
推荐阅读
- javascript - (Angular) 使用 jQuery(或纯 JS)检查特定的 mat-slide-toggles
- ruby-on-rails - 如何在调用条带支付创建 API 时修复错误?
- version-control - 当有另一个分支时,我可以删除一个分支吗?
- c - 如何在数组中使用类型转换来分隔数据?
- c# - 如何在单独的 opengl 数组对象中正确渲染网格?
- wasp - 在调试模式下启用 WASP 服务器
- php - 如何获取从 Laravel 中的视图上传的文件?
- sql - 我们如何从 BigQuery 中删除重复数据并将其保存到另一个具有很多属性的表中
- flutter - 基于流的颤振小吃店展示
- swift - 如何调整正在打印的图像的大小?