ArrayList HashSets перебирает индексы, которые я не указываю?
isPrime()
проверяет, является ли число простым, и getPrimes(int upper)
получает все простые числа, включая верхние. я хочу sievePrimeFactorSets
создать HashSet из всех простых факторов (без повторов) каждого числа и сохранить этот HashSet с заданным значением, например, HashSet в primeFactors.get(20) = [2,5]
,
Прямо сейчас он добавляет каждое простое число к каждому значению, поэтому primeFactors.get(20) = [2,3,5,7,11,13,etc]
, Почему это происходит?
public ArrayList<HashSet<Integer>> sievePrimeFactorSets(int upper)
{
ArrayList<HashSet<Integer>> primeFactors = new ArrayList<HashSet<Integer>>();
HashSet<Integer> empty = new HashSet<Integer>();
for (int i = 0; i <= upper; i++)
{
primeFactors.add(empty);
}
ArrayList<Integer> primes = getPrimes(upper);
for (Integer p : primes)
{
for (int j = p; j <= upper; j+=p)
{
primeFactors.get(j).add(p);
}
}
return primeFactors;
}
public ArrayList<Integer> getPrimes (int upper)
{
ArrayList<Integer> primes = new ArrayList<Integer>();
primes.add(2);
for (int i = 3; i <= upper; i++)
{
if (isPrime(i))
{
primes.add(i);
}
}
return primes;
}
1 ответ
Решение
Эта строка:
primeFactors.add(empty);
добавляет один и тот же пустой хэш для каждого элемента массива. Таким образом, каждый элемент разделяет один и тот же хэш-набор, и изменения, которые, по вашему мнению, вы вносите в один, фактически вносятся во все элементы.
Просто замените на:
primeFactors.add(new HashSet<>());