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<>());
Другие вопросы по тегам