簡體   English   中英

為什么while循環內的foreach循環出錯?

[英]Why do I get an error with a foreach loop inside a while loop?

我為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循環現在在那里。

首先,我假設循環的正確語法是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);
         }
     }
}

foreach循環將使用Iterator遍歷您的列表,並禁止使用primes.add(no)進行更改。

由於您的列表是ArrayList ,因此可以使用primes.get(i)primes.size()通過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);
        }
    }
}

您不得在附魔的for循環中(或與此相關的任何其他內容)修改Collection

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM