2014-11-20 144 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