使用ArrayList

时间:2016-02-28 13:01:47

标签: java primes

有人能告诉我下面的代码有什么问题吗? 我想要打印小于41的所有素数,但它也会打印15,21这些不是素数。

import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        int x = 41;
        List<Integer> lista = new ArrayList<Integer>();

        for (int i = 1; i<=x; i++){

            lista.add(i);
        }
        System.out.println(lista);



        for (int i = 0; i<lista.size()-1; i++){
        if (!isPrime(lista.get(i))){
            lista.remove(lista.get(i));
            }
        }
        System.out.println(lista);
    }

    public static boolean isPrime(int x){
        boolean itIs = true;
        for (int i = 2; i < x; i++){
            if(x%i == 0){
                itIs = false;  
            }
        }
        return itIs;
    }
}

1 个答案:

答案 0 :(得分:3)

从ArrayList中删除元素时,可以更改ArrayList其余部分的索引,因此循环会跳过一些数字。

一种可能的解决方法是在从List中删除元素后减少循环的计数器:

                for (int i = 0; i<lista.size()-1; i++){
                    if (!isPrime(lista.get(i))){
                        lista.remove(lista.get(i));
                        i--;
                    }
                }

更好的解决方案是将找到的素数添加到新列表中,同时保持原始列表不变。