HashSet 的 ArrayList 迭代我未指定的索引?
ArrayList of HashSets iterating over indexes I don't specify?
isPrime()
检查一个数是否为素数,而 getPrimes(int upper)
获取包括 upper 在内的所有素数。我希望 sievePrimeFactorSets
为每个数字的所有质因数(无重复)创建一个 HashSet,并将该 HashSet 存储在给定值处,例如primeFactors.get(20) = [2,5]
处的 HashSet。
现在它将每个素数添加到每个值,所以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;
}
这一行:
primeFactors.add(empty);
向数组的每个元素添加相同的空哈希集。所以每个元素共享相同的哈希集,你认为你对一个元素所做的更改实际上是对所有元素进行的。
只需替换为:
primeFactors.add(new HashSet<>());
isPrime()
检查一个数是否为素数,而 getPrimes(int upper)
获取包括 upper 在内的所有素数。我希望 sievePrimeFactorSets
为每个数字的所有质因数(无重复)创建一个 HashSet,并将该 HashSet 存储在给定值处,例如primeFactors.get(20) = [2,5]
处的 HashSet。
现在它将每个素数添加到每个值,所以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;
}
这一行:
primeFactors.add(empty);
向数组的每个元素添加相同的空哈希集。所以每个元素共享相同的哈希集,你认为你对一个元素所做的更改实际上是对所有元素进行的。
只需替换为:
primeFactors.add(new HashSet<>());