为什么在while循环中出现foreach循环错误?

时间:2014-11-20 17:35:36

标签: java eclipse for-loop collections

我为Project Euler上的问题7制作的快速程序不断产生错误。

我不熟悉Java。我将问题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循环现在就在那里。

3 个答案:

答案 0 :(得分: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 :(得分:1)

foreach循环将使用Iterator浏览您的列表,禁止您尝试使用primes.add(no)进行更改。

由于您的列表是ArrayList,因此您可以i-th访问primes.get(i)元素,primes.size()的大小可以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); } } } 。一个简单的方法是:

{{1}}

答案 2 :(得分:0)

您不能修改已加密的Collection循环中的for(或其他任何内容)