java - 建议修复 if 语句中的非法状态异常错误

标签 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 语句内部的部分。它说非法状态异常。有人可以帮我弄清楚如何解决这个问题吗?

最佳答案

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

"IllegalStateException - if the next method has not yet been called, or the remove method has already been called after the last call to the next method"

应该是:

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 的倍数。

这表明您应该使用更好的变量名称。

关于java - 建议修复 if 语句中的非法状态异常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10022263/

相关文章:

java - JPanel GridBagLayout

java - 关于 Servlet 3.1 非阻塞 IO 示例的问题

lambda - event-b:是否可以在一个表达式中通过 lambda 生成从 ... 到 ... 的素数序列?

java - 如何生成两个大于10^25的素数p1,p2

java - 如何检查日期和时间戳是在 20 分钟之前

java - 组件类型可以映射到 hibernate 中的实体类型吗?

java - 使用 Jython 运行 HtmlUnit - 命令行启动问题

python - 证明强可能素数的素数

c - 最后一步 : adding all the primes that the reverse are also primes

python - 通过最小和生成整数组合