建议修复if语句中的错误illegalStateException

时间:2012-04-05 03:23:33

标签: java primes

我正在编写一个打印给定长度的素数集的应用程序。这是一般长度的应用程序,例如所有数字形式为1到100

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;


public class Sieve
{
    private int number;

    public Sieve (int maxPrime)
    {
        number = maxPrime;
    }

    public Set<Integer> getPrimes()
    {
        Set<Integer> setNumbers = new TreeSet<Integer>();


        for(int i=2; i<=number; i++)
        {
            setNumbers.add(i);
        }

        Iterator<Integer> iter = setNumbers.iterator();

        while(iter.hasNext())
        {
            int number1 = iter.next();

            for( int i = 2; i <= Math.sqrt(number); i++ )
            {
                if( number1 % i == 0)
                {
                    iter.remove();
                }
            }

        } 
        return setNumbers;
    }
}

给我一​​个错误的部分是if语句中的部分。它说的是illegalStateException。有人可以帮我弄清楚如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您在remove之间多次调用next方法。来自docs

  

“IllegalStateException - 如果尚未调用下一个方法,   或者在最后一次调用后调用了remove方法   下一个方法“

应该是:

bool isComposite = false;

for( int i = 2; i <= Math.sqrt(number1); i++ )
{
    if( number1 % i == 0)
    {
        isComposite = true;
        break;
    }
}

if(isComposite)
{
    iter.remove();
}

算法错误是你要达到number的平方根(要考虑的最大可能素数),而不是你正在考虑的当前素数number1的根。这意味着你将排除2,因为它小于sqrt(100)并且是2的倍数。

这是一个标志,你应该使用更好的变量名。