Вы пытаетесь удалить элемент из списка, в котором вы сейчас выполняете итерацию, таким образом, возникает ConcurentModifiacationException.
См. Здесь: https://stackoverflow.com/a/18448699/8851887
Я работаю над проблемой 03 Project Euler в качестве новичка Java. (Найдите самый большой основной коэффициент 600851475143.) Это был мой первый раз, когда я использовал ArrayLists, и появилось несколько недоразумений - надеюсь, их можно будет очистить!
public static ArrayList<Integer> primeList (int n){
ArrayList<Integer> prime = new ArrayList<Integer> ();
for (int i = 2; i <= n; i++) {
prime.add(i);
}
// Sieb des Eratosthenes
for (int i = 2; i <= Math.sqrt(n); i++) {
for (Integer j : prime) {
if (j > i && j % i == 0) {
prime.remove (Integer.valueOf(j)); // some error.
}
}
}
return prime;
}
Это мой код для Сито Эратосфена . Вероятно, это не очень оптимально, я знаю, что - я все равно продолжу работу по оптимизации моего алгоритма.
Однако меня действительно беспокоит то, что этот не компилируется. Так или иначе, он компилируется для n = 2, 3, 5. Для большинства других значений, которые я пробовал, это не так.
Почему это? А точнее, где ошибка?
Я смог заставить его работать с «нормальным» циклом, а не для каждого цикла. Это был счастливый конец, по крайней мере, я думаю.
EDIT: оценив его в основном с Sys.out(primeList(9))
, я получаю сообщение об ошибке:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:907)
at java.util.ArrayList$Itr.next(ArrayList.java:857)
at problem03.TestPrime.primeList(TestPrime.java:18)
at problem03.TestPrime.main(TestPrime.java:7)