Реализация итератора для массива - PullRequest
0 голосов
/ 02 января 2019

У меня есть список экземпляров DynamicArray, который в значительной степени является массивом, и здесь я пытаюсь реализовать итератор:

Проблема в том, что мне не разрешено добавлять какие-либо поля, поэтому нетполе индекса ... и я пытаюсь написать метод 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;
}


}

Есть ли способ исправитьэтот?или есть идеи, как использовать поле, которое я должен сделать?

1 Ответ

0 голосов
/ 02 января 2019

Насколько я понял вопрос, основная проблема заключается в инициализации возрастающего значения, которое сбрасывается до 2 при каждом вызове next().

Чтобы решить такую ​​проблему, вы можете получить доступ кПоследняя запись в списке, просто позвонив 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;
}
...