2014-11-20 2 views
1

Быстрая программа, которую я сделал для проблемы 7 в Project Euler, продолжает вызывать ошибку.Почему я получаю сообщение об ошибке с циклом foreach внутри цикла while?

Я не знаком с Java. Я передал код Python для проблемы 7 на 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) 

EDIT: код был Неправильно, теперь используется цикл for, который я изначально использовал.

+0

Какая версия Java вы используете? – Matthieu

+1

Действительно ли это код Java? – A4L

+0

@ A4L Я думаю, что это Java 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. – Comarki

0

Вы можете не изменять в качестве enchaned for петли на Collection (или в любом другом по этому вопросу)

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); 
     } 
    } 
} 
+0

Ах, извините, это был исходный код цикла for (int i: primes) { – Comarki

Смежные вопросы