2014-11-20 143 views
1

我爲項目歐拉問題7所做的快速程序不斷產生錯誤。爲什麼我在while循環中出現foreach循環的錯誤?

我對Java不熟悉。我將Problem 7中的Python代碼轉換爲Java,看看我能否做到。我正在教自己Java來領先於遊戲。

我的Python程序的代碼是:

no = 2 
print(3 % 2) 
primes = [2] 
while len(primes) != 10001: 
    no = no + 1 
    no2 = 0 
    for each in primes: 
     if no % each != 0: 
      no2 = no2 + 1 
      if len(primes) == no2: 
       print(primes[-1]) 
       primes.append(no) 
print("Final answer is: " + str(primes[-1])) 

我的Java程序的代碼是:

import java.util.ArrayList; 
import java.util.List; 

public class P7Euler { 

    public static void main(String[] args) { 
     int no = 2; 
     int no2 = 0; 
     List<Integer> primes = new ArrayList<Integer>(); 
     primes.add(2); 
     while (primes.size() != 20){ 
      no = no + 1; 
      no2 = 0; 
      for(int i : primes){ 
       if(no % i != 0){ 
        no2 = no2 + 1; 
        if(primes.size() == no2){ 
         System.out.println(primes.get(primes.size() - 1)); 
         primes.add(no); 
        } 
       } 

      } 
     } 
     System.out.println("The final answer is: " + primes.get(primes.size() - 1)); 
    } 
} 

錯誤消息:

Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source) 
    at java.util.ArrayList$Itr.next(Unknown Source) 
    at Test1.examples.P7Euler.main(P7Euler.java:16) 

編輯:該代碼是錯了,我原來使用的for循環現在在那裏。

+0

您正在使用哪個版本的Java? – Matthieu 2014-11-20 17:38:35

+1

這是真的java代碼? – A4L 2014-11-20 17:40:17

+0

@ A4L我認爲它是Java 8和它的「lambdas」(他們更喜歡通過未簽名的支持(視力)) – Matthieu 2014-11-20 17:44:10

回答

4

首先,我假設循環的正確語法是for(int i : primes){

使用foreach循環遍歷元素時,不能修改列表。嘗試使用java.util.ListIterator要添加到列表中,而迭代:

for (ListIterator<Integer> listIterator = primes.listIterator(); listIterator.hasNext();) { 
    int i = listIterator.next(); 
    if(no % i != 0){ 
     no2 = no2 + 1; 
     if(primes.size() == no2){ 
       System.out.println(primes.get(primes.size() - 1)); 
       listIterator.add(no); 
     } 
    } 
} 
+1

是的,我知道,看底部的編輯。我試過你的代碼,它的工作。謝謝很多! Comarki。 – Comarki 2014-11-20 17:56:11

0

您不能修改在enchaned for迴路Collection(或者以任何其他爲此事)

1

foreach循環將使用Iterator通過您的名單,禁止您試圖使用primes.add(no)進行的更改。

當你的列表是一個ArrayList,您可以用primes.get(i)無需額外成本,並通過primes.size()大小訪問i-th元素。一個簡單的出路將是:

for (int idx = 0; idx < primes.size(); idx++){ 
    int i = primes.get(idx); 
    if (no % i != 0) { 
     no2 = no2 + 1; 
     if(primes.size() == no2){ 
      System.out.println(primes.get(primes.size() - 1)); 
      primes.add(no); 
     } 
    } 
} 
+0

對不起,這是(int i:primes)循環的原始代碼{ – Comarki 2014-11-20 17:50:53