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

这两个问题似乎都与如何捕获由NumberFormatException引发的Integer.parseInt()或提供更好的API(通过封装Integer.parseInt()不使用异常)有关。

但是,没有一种方法专门用于解决性能方面的问题,即如果输入不能解析为Integer.parseInt(),则Java的int会引发异常。如果您的大部分输入都包含有效的int,则无关紧要。但是,如果您的输入包含可能不是int的大量数据,并且您需要对其进行解析,则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/

10-16 01:42