Первичный статический массив для числового класса

Я хотел бы сделать класс Number, который имеет статический набор простых чисел.

Я хочу, чтобы числа были сохранены в статическом наборе для класса, но я хочу добавить числа к набору, поскольку классу предлагается найти простые числа. Как и в случае, я хочу добавлять числа к этому набору только тогда, когда вызывается отдельный метод для проверки простого числа и найдено простое число.

По какой-то причине статический финальный набор стирается сам, когда другой класс использует этот класс (Number).

Вот часть моего кода для класса Number.

public class Number {

    private int number;
    static final HashSet<Integer> pSet = new HashSet<>();
    static {
        pSet.add(2);
    }

    public Number(int n) {
        number = n;
    }

    public boolean isPrime() {
        boolean out = true;
        if (number == 1) { return true; }
        if (pSet.contains(number)) { return true; }
        for (int i : pSet) {
            if (number%i == 0) {
                out = false;
                break;
            }
        }
        if (out) { pSet.add(number); }
        return out;
    }
}

Как я могу сделать так, чтобы этот набор не переопределял сам себя, но не определялся статически?

2 ответа

Решение

Оригинальный пост, содержит некоторые недоразумения.. вот предлагаемое исправление:

public class Number 
{
    public static HashSet<Integer> pSet;
    static 
    {
        pSet = new HashSet<>();
        pSet.add(2);
    }

    public static boolean isPrime(int n) 
    {
        boolean out = true;
        if (n == 1) { return true; }
        if (pSet.contains(n)) { return true; }

        for (int i = 2; i < n; i++)
        {
            if (n % i == 0) {
                out = false;
                break;
            }
        }
        if (out) { pSet.add(n); }
        return out;
    }
}

по моему мнению, метод isPrime должен быть статическим.. нет смысла создавать экземпляр класса только для запуска теста над числом

роль pSet (как заявлено заявителем) состоит в том, чтобы хранить кэш ранее проверенных простых чисел (поэтому каждое число проверяется один раз)

Я немного смущен. В опубликованном вами коде набор не должен быть удален, поскольку вы определили его как статический. Вы говорите, что когда вы делаете это не статичным, тогда это стирается, когда вы вызываете класс?

Я предполагаю, что класс работает так, как вы его опубликовали, но вы хотите сделать Set нестатичным, но когда вы это сделаете, он будет удален.

Итак, первое, что нужно сделать, это:

private final HashSet<Integer> pSet = new HashSet<>(); // Changed to private

Проблема в том, что ваш вызывающий код должен сказать

Number n = new Number(15); // Or whatever number you're calling it with

поэтому каждый раз, когда вы звоните, он получает новую копию номера, и ваш набор исчезает.

Поэтому вместо этого сделайте, чтобы ваш вызывающий код создавал только один Number(), но у него есть новый метод в Number, который выглядит следующим образом:

public void setNumber(int n){
    number = n;
}

Тогда каждый раз, когда вы хотите позвонить по номеру, вы можете позвонить

number.setNumber(5);
number.isBoolean();
Другие вопросы по тегам