Новое в наборах: Как реализовать сито Эратосфена в Яве - PullRequest
0 голосов
/ 11 ноября 2018

Я новичок в сетах и ​​нашел эту проблему в книге:

Реализация сито Эратосфена: метод вычисления простых чисел, известный древним грекам. Выберите n. Этот метод вычислит все простые числа до n. Сначала вставьте все числа от 2 до n в набор. Затем сотрите все кратные 2 (кроме 2); то есть 4, 6, 8, 10, 12,… Сотрите все кратные 3; то есть 6, 9, 12, 15,… Подняться на . Затем распечатайте набор.

Я написал этот код:

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class SieveOfEratosthenes {
    public static void main (String[] args){
        System.out.print(generatePrime(20));
    }

    public static Set generatePrime(int n){
        Set<Integer> primes = new TreeSet<>();
        Iterator<Integer> iter = primes.iterator();

        //generate all numbers up to n and add them to the set
        for (int i = 2; i < n; i++){
            primes.add(i);
        }

        //for numbers up to root n
        for (int f = 2; f <= Math.sqrt(n); f++){
            while (iter.hasNext()){
                int current = iter.next();
                if (current % f == 0 && current != 2){
                    primes.remove(current);

                }
            }

        }

        return primes;
    }
}

Проблема в том, что код в цикле while не реализуется. Когда я отлаживал программу, я обнаружил, что hasNext () возвращает ноль. Я не мог выяснить причину этого, хотя список содержит цифры.

Это вывод, который я получаю из кода:

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Process finished with exit code 0

Заранее спасибо!

1 Ответ

0 голосов
/ 11 ноября 2018

Вы создаете Iterator до , добавляете элементы в Set, когда вам нужно его создать после (внутри цикла for):

Set<Integer> primes = new TreeSet<>();

//generate all numbers up to n and add them to the set
for (int i = 2; i < n; i++) {
    primes.add(i);
}

//for numbers up to root n
for (int f = 2; f <= Math.sqrt(n); f++){
    Iterator<Integer> iter = primes.iterator();

Также я рекомендую изменить следующее:

primes.remove(current);

Кому:

iter.remove();

Чтобы избежать любых ConcurrentModificationException с.


Наконец, кажется, что у вас все еще есть проблема, в которой 3 отсутствует в результирующем Set, которую вам придется отлаживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...