2015-07-21 28 views
0

isPrime()檢查一個數是否爲素數,並且getPrimes(int upper)得到所有素數達到幷包括上限。我想要sievePrimeFactorSets對每個數字的所有素數因子(不重複)做一個HashSet,並將該HashSet存儲在給定的值上,例如。 HashSet在primeFactors.get(20) = [2,5]迭代索引的HashSets ArrayList我沒有指定?

現在它增加了每一個主要價值,所以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; 
} 
+0

建議使用'I + = 2',而不是'I ++'在'getPrimes()'循環,2是唯一的偶素 –

+0

也許我建議一個'地圖>'可能比使用'ArrayList >'更適合這種事情? –

回答

3

這條線:

primeFactors.add(empty); 

添加相同的空散列設置於所述陣列的每個元素。因此,每個元素共享相同的散列集,並且您認爲您對其中一個元素進行的更改實際上是針對所有元素進行的。

只需更換有:

primeFactors.add(new HashSet<>()); 
+1

我愛你。那是喬瓦尼回答的。還要感謝Jason S,它會加快速度。 – windydiver

+0

你可以接受答案:) –