2014-11-20 2 views
1

프로젝트 오일러 문제 7에 대한 빠른 프로그램에서 오류가 계속 발생합니다.while 루프 내에서 foreach 루프에 오류가 발생하는 이유는 무엇입니까?

Java에 익숙하지 않습니다. 문제 7에 대한 Python 코드를 Java로 옮겨서 할 수 있는지 확인했습니다. Java를 게임보다 앞서 가르치고 있습니다.

내 파이썬 프로그램의 코드는 다음과 같습니다

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])) 

내 자바 프로그램에 대한 코드는 다음과 같습니다

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

+1

정말 자바 코드입니까? – A4L

+0

@ A4L 자바 8과 그 "lambdas"(부호없는 지원 (시력)보다 선호) – Matthieu

답변

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

0

당신은 foreach 루프는 Iterator를 사용

1

(그 문제에 대한 모든 다른 나에)를 enchaned for 루프에서 Collection을 수정할 수 없습니다 귀하의 목록을 검토하여 변경하려는 내용을 primes.add(no)으로 금지하십시오. 목록으로

primes.get(i)와 추가 비용 및 primes.size()으로 크기로 i-th 요소에 액세스 할 수 ArrayList입니다. 쉬운 방법은 다음과 같습니다.

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

관련 문제