我正在练习如何优化代码,因此任何建议将不胜感激。我有这种方法,当数字增加零填充到一个数字。代码如下:
public class CommonAlgorithm {
NumberRetrieve retrieve;
public long incrementNumber(CommonNumber t) {
CommonNumberFacade facade = new CommonNumberFacade(retrieve.apply(t));
String number = facade.getGeneratedNumber();
Long num = Long.parseLong(number);
num++;
String result = "";
if (String.valueOf(num).length() < number.length()) {
int length = number.length() - String.valueOf(num).length();
String zero = "";
for (int i = 0; i < length; i++) {
zero += "0";
}
result = zero + num;
} else {
result = String.valueOf(num);
}
return Long.parseLong(t.getPrefix()+result);
}
}
还有更多方法可以优化上面的代码吗?
只要有人要求该功能的目的,前提就是这样:
该函数返回一个数字,该数字由以下各项组成:“前缀”和“数字”。将数字增加1后,这两个按钮会彼此串联。但是,我意识到,如果number
的值中填充了零,则这些零一旦转换为{{ 1}}数据类型。因此,如果应用以下值:
前缀= 123
号码= 000001
返回值为long
,而不是1232
。那就是以上功能正在解决的问题。我无法将123000002
函数的返回类型更改为facade.generatedNumber()
,因为最终需要在项目中的某个地方返回long
的返回类型。希望您能提出一些建议
答案 0 :(得分:3)
您可以按如下方式简化if-else语句:
StringBuilder sb = new StringBulder();
String numStr = String.valueOf(num);
for (int i = numStr.length(); i < number.length(); i++) {
sb.append('0');
}
sb.append(numStr);
String result = sb.toString();
答案 1 :(得分:2)
一些简单的事情:
zero
和result
。这些可能是StringBuilder对象。显然可以表达您构建字符串的意图!String.valueOf(num);
3次。您最初可以执行一次,然后重用该值,而不必重复计算。答案 2 :(得分:2)
使用数字基本类型long
而不是对象包装器Long
。
long num = Long.parseLong(number);
num++;
将num
的字符串表示形式放入其自己的变量中。
String numStr = String.valueOf(num);
仅需为负的增量递增零填充即可保留原始位数,然后仅对进位/数字'0'填充。这意味着零应在符号后 。
String +, +=
非常昂贵,请使用StringBuilder:
StringBuilder sb = new StringBuilder(number.length());
最优是相对的,可以这样做:
long num = Long.parseLong(number);
++num;
String paddedNumStr = numStr.length >= number.length() ? numStr
: String.format("%" + number.length() + "d", num);
使用if表达式作为启发式优化方法来处理95%的情况。