我试图从arraylist中删除所有素数,但什么都没有打印?

时间:2014-12-17 04:21:15

标签: java arrays

我是一个新手,所以我为任何愚蠢的错误道歉。

以下是代码:

    public static void keepOnlyCompositeNumbers( List<Integer> nums ){

    int num=0;
    boolean isPrime=true;
    for(int i=0; i<nums.size(); i++){
        num=nums.get(i);
        {
            for (int o = 2; o < num; ++i)
            {
                if (num % o == 0){
                    isPrime=false;
                    o=2;        
                    if(isPrime==true){
                                nums.remove(num);
                            }
                }


            }


}

跑步者班:

    Integer[] nums = {2,6,8,9,10,12,13,15,17,24,55,66,78,77,79};
    List<Integer> list = new ArrayList<Integer>( Arrays.asList(nums) );

    System.out.println( list );
    ArrayListFunHouse.keepOnlyCompositeNumbers( list );
    System.out.println( list );

什么都没打印。有人可以告诉我,我做错了吗?我被困了很长一段时间。任何帮助,将不胜感激。谢谢!

6 个答案:

答案 0 :(得分:1)

您可以这样使用:

public static void keepOnlyCompositeNumbers( List<Integer> nums ){
  boolean isPrime=false;
  for(int i=0;i<nums.size();i++){
  isPrime = checkPrime(nums.get(i));
    if(isPrime){
        nums.remove(i);
    }
  System.out.println(nums);
}
boolean checkPrime(int n) {
        for(int i=2;i<n;i++) {
            if(n%i==0)
                return false;
        }
        return true;
}

获取for循环中的每个数字,如果返回值为真,则返回单独的for prime方法,这是素数,而不是删除它。

由于无限循环,你没有得到输出

for (int o = 2; o < num; ++i)

问题是你是增量而不是o,当获得大于2的输入时,循环将变为无限

答案 1 :(得分:1)

更高效的检查Prime

boolean checkPrime(int n) {
        for(int i=2;i<=n/2;i++) {
            if(n%i==0)
                return false;
        }
        return true;
}

答案 2 :(得分:0)

请看看

public static void main(String[] args) throws IOException {
        Integer[] nums = { 2, 6, 8, 9, 10, 12, 13, 15, 17, 24, 55, 66, 78, 77, 79 };
        List<Integer> list = new ArrayList<Integer>(Arrays.asList(nums));

        System.out.println("Original List => " + list);
        keepOnlyCompositeNumbers(list);
        System.out.println("FInal List => " + list);
    }

    public static void keepOnlyCompositeNumbers(List<Integer> nums) {

        for (int i = 0 ; i < nums.size() ; i++) {
            if (isPrime(nums.get(i))) {
                nums.remove(i);
            }
        }
    }

    public static boolean isPrime(int number) {
        for (int i = 2 ; i < number ; i++) {
            if (number % i == 0) {
                return false; // number is divisible so its not prime
            }
        }
        return true; // number is prime now
    }

<强>输出

  

原始列表=&gt; [2,6,8,9,10,12,13,15,17,24,55,66,78,77,   79]

     

FInal List =&gt; [6,8,9,10,12,15,24,55,66,78,77]

答案 3 :(得分:0)

根据Sarz的回答,这样的事情应该对checkPrimes更好一点:

public static void keepOnlyCompositeNumbers( List<Integer> nums ){
  boolean isPrime=false;
  for(int i=0;i<nums.size();i++){
  if ( checkPrime(nums.get(i), nums)) 
        nums.remove(i);
}
boolean checkPrime(int n, List <Integer> primes) {
    sqrtn = Math.sqrt(n) ;
    for (Integer p : primes) {
        if (p > sqrtn) 
             return true;
        if (n % p == 0)
             return false
    }
}

答案 4 :(得分:0)

这里有很多错误。可能还有其他人。

   num=nums.get(i);
    {
        for (int o = 2; o < num; ++i)
        {
            if (num % o == 0){
                isPrime=false;
                o=2;        
                if(isPrime==true){
                            nums.remove(num);
                        }
            }


        }

1)for (int o = 2; o < num; ++i)似乎是一个错字。当o变为num或更高时,循环将退出。但是你没有递增o,而是递增i。可以理解,因为它们在键盘上彼此相邻,并且编译器没有捕获它,因为i作为变量存在。

2)即使您将其更改为o++,如果数字为非素数,您也可以通过设置o=2来破坏您的循环。这意味着o < num将永远不会成立,因为你将它设置回2,循环将永远持续。

看来你正试图说“这个数字是复合的,所以让我们转到下一个数字”。但你不是。 nums.remove(num)从列表中删除num,但不会更改数字。你没有做任何事情要告诉它去下一个numnum循环中没有任何内容更改for。有一个声明指向num 外部 for循环,但只要你陷入for,这对你没有任何帮助。循环。

3)isPrime==true测试位置错误。它永远不会成功,因为你只需将它设置为false。在检查每个除数后,检验isPrime==true的正确位置。这意味着你必须在结束大括号之后将其移动到外面 for循环。 (另外,您不需要说if (isPrime==true);通常的方法只是if (isPrime)。)

4)还有一个微妙的错误导致许多人绊倒。如果您有一个通过列表的索引,并且在该循环的中间您从列表中删除一个项目,您将错过列表中的数字。考虑一下:

List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
for (int i = 0; i < list.size(); i++) {
    int num = list.get(i);
    if (needToDelete(num)) {
        list.remove(i);
    }
}

第一次循环时,i为0,num为10.假设我们决定需要删除10个。所以我们删除它。该列表现在是[20,30,40]。然后我们返回,将i增加到1,并将num设置为list.get(1) - 现在是30!所以我们从未看过元素20.

有许多方法可以区别对待。我不喜欢在for循环中改变索引,所以我会这样做:

int i = 0;
while (i < list.size()) {
    num = list.get(i);
    if (needToDelete(num)) {
        list.remove(i);
    } else {
        i++;
    }
}

请注意,仅当我不从列表中删除元素时才会增加i。如果我这样做,i保持不变,现在将成为下一个元素的索引,因为我删除了之前的元素。

答案 5 :(得分:0)

1) Put boolean isPrime = true; inside for loop. 
2) in for(int o = 2; o < num; ++i) // change ++i to ++o 
3) comment out o=2;  //o=2 and put a break;
4) put nums.remove(i); outside for loop

public static void keepOnlyCompositeNumbers(List<Integer> nums) {
int num = 0;
for (int i = 0; i < nums.size(); i++) {
    boolean isPrime = true;
    num = nums.get(i);
    {
    for (int o = 2; o < num; ++o) {
        if (num % o == 0) {
        isPrime = false;
        // o=2;
        break;
        }

    }
    if (isPrime == true) {
        nums.remove(i);
    }

    }
}
}