我正在构建一个高效的系统。我必须比较数字的字符串,长度为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;
}
//
答案 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记录器,它占用了所有额外的时间,并且它不存在于大整数代码中。这么大的整数很慢,因为它做了将字符串转换为大整数的额外工作。