java - 如何有效地(不会因无效输入引发异常)解析 Java 中的整数?

标签 java

此问题是 Does java have a int.tryparse that doesn't throw an exception for bad data? 的后续问题,它被标记为 Java: Good way to encapsulate Integer.parseInt() 的重复项.

这两个问题似乎更多的是关于如何捕获 NumberFormatExceptionInteger.parseInt() 抛出或者通过封装Integer.parseInt()提供一个不使用异常的更好的API .

但是两者都不是专门针对 Java 的 Integer.parseInt() 的性能方面问题而制定的。如果输入不可解析为int,则抛出异常。如果您的大部分输入包含有效的 int s,这没关系。但是,如果您的输入包含大量数据,这些数据可能是也可能不是 int s 并且您需要解析它,Integer.parseInt()效率会很低。

因此,这个具体问题是关于如何有效地解析整数,因为输入可能包含大量有效整数,但也包含大量无效整数。

最佳答案

Here is a good article about efficiently parsing integers.原始站点已关闭,因此我在返回机器上添加了链接。

返回 Integer 而不是 int 会使代码变慢。您可以采用本文中的代码并返回 Integer.MIN_VALUE、零或其他值,具体取决于您的情况:

public static int parseInt( final String s )
{
    if ( string == null )
        return Integer.MIN_VALUE;

    // Check for a sign.
    int num  = 0;
    int sign = -1;
    final int len  = s.length( );
    final char ch  = s.charAt( 0 );
    if ( ch == '-' )
    {
        if ( len == 1 )
            return Integer.MIN_VALUE;
        sign = 1;
    }
    else
    {
        final int d = ch - '0';
        if ( d < 0 || d > 9 )
            return Integer.MIN_VALUE;
        num = -d;
    }

    // Build the number.
    final int max = (sign == -1) ?
        -Integer.MAX_VALUE : Integer.MIN_VALUE;
    final int multmax = max / 10;
    int i = 1;
    while ( i < len )
    {
        int d = s.charAt(i++) - '0';
        if ( d < 0 || d > 9 )
            return Integer.MIN_VALUE;
        if ( num < multmax )
            return Integer.MIN_VALUE;
        num *= 10;
        if ( num < (max+d) )
            return Integer.MIN_VALUE;
        num -= d;
    }

    return sign * num;
}

关于java - 如何有效地(不会因无效输入引发异常)解析 Java 中的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35098868/

相关文章:

java - Android :java. sql.SQLException:结果集中没有当前行

java - 未处理的异常 : PlatformException (sign_in_failed, com.google.android.gms.common.api.ApiException : 10: , null, null) - 在一个系统中运行良好

java - Spring Thymeleaf中如何提交表数据

java - Android 简单方法不起作用?

java - 尝试将 Project Loom/Virtual Threads 与 OpenJDK 19-loom JAVA 结合使用时出现问题

java - 从 TableView 中删除行时的事件处理程序

java - 使用 attributeconverter 时,Spring Boot 应用程序未完成启动

java - 在java中使用非jni native 库

java - 如何清除/重置/打开输入流,以便它可以在 Java 中的 2 种不同方法中使用?

java - 加载失败,请确认其已声明