0

isPrime()检查一个数字是否为素数,并getPrimes(int upper)获取所有素数,包括上限。我想sievePrimeFactorSets为每个数字的所有主要因素(不重复)制作一个 HashSet,并将该 HashSet 存储在给定值处,例如 HashSet at 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;
}
4

1 回答 1

3

这一行:

primeFactors.add(empty);

将相同的空哈希集添加到数组的每个元素。因此,每个元素共享相同的哈希集,并且您认为对其中一个元素所做的更改实际上是对所有元素进行的。

只需替换为:

primeFactors.add(new HashSet<>());
于 2015-07-21T15:37:17.463 回答