标记为“继续”似乎不起作用

时间:2014-02-21 16:28:46

标签: java primes labelled-break

刚开始学习java,我无法理解我的代码有什么问题。 PrimeIterator 应该生成无限数量的素数(从数字3开始),但是当我打印输出时,我得到:3,5,7,9,11,13,15等。

public class Prime {

    PrimeIterator iter = new PrimeIterator();

    private class PrimeIterator implements java.util.Iterator<Integer>
    {
        int numb = 1;

        public boolean hasNext() 
        {
            return true;
        }

        public Integer next() 
        {
            nextCandidate:
            do{
                numb += 2;
                int numbSqrt = (int)java.lang.Math.sqrt(numb);

                for (int i = 3; i <= numbSqrt; i = i+2)
                {
                    if (numb % i == 0)
                    {
                        continue nextCandidate;
                    }
                }
            }while(false);
            return numb;
        }

        public void remove() {}
    }

    void printPrimes()
    {
        System.out.print(2);
        while(iter.hasNext())
        {
            try 
            {
                Thread.sleep(500);
            } catch (InterruptedException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.print(", " + iter.next());   
        }
    }
}

我想在我的do-while循环中使用标记为“continue”的语句。然而,我的直觉告诉我,我错误地使用它。

2 个答案:

答案 0 :(得分:1)

麻烦在于while(false)延续条件。作为do while(false)语句,这意味着它永远不会循环多次。也就是说,当您尝试将执行跳转到带标签的语句时,它将不再循环通过do while,因为即使您认为{{false,也不会验证延续条件(continue) 1}}将再次执行循环。

因此,每次numb方法执行时,它永远不会增加next()次。

我会做以下事情:

nextCandidate:
do{
    numb += 2;
    int numbSqrt = (int)java.lang.Math.sqrt(numb);

    for (int i = 3; i <= numbSqrt; i = i+2)
    {
        if (numb % i == 0)
        {
            continue nextCandidate;
        }
    }
    break;

}while(true);

答案 1 :(得分:1)

以下是我看到的问题

  1. 你甚至不打印输出。

  2. (int)java.lang.Math.sqrt(5)最终会截断为2。你应该在你的平方根上加1,因为如果你没有足够的迭代就会出现问题,但是如果迭代次数超过你需要的话就没问题。

  3. 当您找到素数时,for循环将结束,while(false)将终止执行循环