Первичный статический массив для числового класса
Я хотел бы сделать класс 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();