比较java中100个长度数字字符串的最快方法

时间:2015-04-10 10:26:02

标签: java string biginteger

我正在构建一个高效的系统。我必须比较数字的字符串,长度为0到128,并且可能在开头有零。

我查了谷歌并发现了一些帖子,但没有人认为字符串长度只要100。

我创建了一个比较器,它检查null,从0开始,长度和字符比较。

我还有另一种使用BigInteger的选择。但尚未确定安全和快速。

如果BigInteger速度很快,我也不知道是什么让它快速实现。

想知道什么是比较长度至少为100的数字字符串的最佳,安全和强大的做法。

为什么带有大整数的第二个运行速度很快?

////

public static boolean isGreaterSequence1(final String newSequence,final String oldSequence){

    if (newSequence == null || oldSequence == null || newSequence.isEmpty() || oldSequence.isEmpty()) {
        return false;
    }
    final String oldSequenceModified = getWithoutStartZero(oldSequence);

    final String newSequenceModified = getWithoutStartZero(newSequence);
    if (oldSequenceModified.compareTo(newSequenceModified) > 0) {
        return true;
    }

    return false;
}

   public static String getWithoutStartZero(final String input) {
    final int length = input.length();
    int end = 0;
    while (end < length) {
        if (input.charAt(end) != '0') {
            break;
        }
        end++;
    }

    return input.substring(end, length);
}

public static boolean tempCompare(final String newSequence, final String oldSequence) {
    final BigInteger ns = new BigInteger(newSequence);
    final BigInteger os = new BigInteger(oldSequence);
    final int res = ns.compareTo(os);
    if (res > 0) {
        return true;
    }
    return false;
}

//

3 个答案:

答案 0 :(得分:1)

获取长度。然后,开始迭代两个跳过前导零的字符串,计算它们。比较length - zeroes。如果不相等则返回较大的那个。

否则,继续迭代比较字符的字符。如果不相等,则一个比另一个大。

诀窍是手动跳过零并从那里继续逐个字符比较。这样,你就不会两次读取任何角色。通常情况下我会建议不要长度,但在java中它无论如何都会给出,并且没有办法避免它。

转换为bigint不会更快,因为它无论如何都需要读取字符串。好好阅读和解析,在这里你只能阅读它。

无论如何,老实说看起来像微优化。它只对比较长度差异很大的字符串很重要。

答案 1 :(得分:0)

你可以用0填充最短的字符串填充,然后将它们作为普通字符串进行比较。

所以如果字符串是

public static final String ZEROS = "0000000000000000000000000000000"; // As long as you need
public int compare(String str1, String str2) {
    if (str1.length > str2.length) {
        str2 = ZEROS.substr(0, str1.length - str2.length) + str2;
    } else {
        str1 = ZEROS.substr(0, str2.length - str1.length) + str1;
    }
    return str1.compareTo(str2);
}

如果你的字符串不能以零开头,你可以按照以下方式更好地实现:

public int compareIfNotStartingWith0(String str1, String str2) {
    if (str1.length != str2.length) {
        return str1.length - str2.length;
    }
    return str1.compareTo(str2);
}

答案 2 :(得分:0)

用于比较字符串的第一个代码片段被认为是赢家,但有些我如何获得执行大整数代码片段的时间更少。发生这种情况是因为我的字符串比较代码中有一个apache记录器,它占用了所有额外的时间,并且它不存在于大整数代码中。这么大的整数很慢,因为它做了将字符串转换为大整数的额外工作。