3 回答
TA贡献2039条经验 获得超7个赞
优先使用String.charAt(int)andCharacter.digit(char, int)来String.split("")解析每个子字符串(并使用 anint[]而不是 an Integer[])。就像是,
public static void main(String[] args) {
String accountNo = "08060002506";
int[] multiplier = {2, 1, 8, 7, 6, 5, 4, 3, 2, 1};
int sum = getSum(multiplier, accountNo);
int remainder = getRemainder(sum);
int checkDigit = 9 - remainder;
System.out.println("Check digit is = " + checkDigit);
}
private static int getSum(int[] multiplier, String accountNo) {
int sum = 0;
for (int i = 0; i < multiplier.length; i++) {
int numToMultiply = Character.digit(accountNo.charAt(i), 10);
sum += multiplier[i] * numToMultiply;
}
return sum;
}
TA贡献1831条经验 获得超10个赞
优先使用String.charAt(int)andCharacter.digit(char, int)来String.split("")解析每个子字符串(并使用 anint[]而不是 an Integer[])。就像是,
public static void main(String[] args) {
String accountNo = "08060002506";
int[] multiplier = {2, 1, 8, 7, 6, 5, 4, 3, 2, 1};
int sum = getSum(multiplier, accountNo);
int remainder = getRemainder(sum);
int checkDigit = 9 - remainder;
System.out.println("Check digit is = " + checkDigit);
}
private static int getSum(int[] multiplier, String accountNo) {
int sum = 0;
for (int i = 0; i < multiplier.length; i++) {
int numToMultiply = Character.digit(accountNo.charAt(i), 10);
sum += multiplier[i] * numToMultiply;
}
return sum;
}
TA贡献1966条经验 获得超4个赞
为了优化计算我建议使用流的并行计算,这是stream api的内置功能。
该问题可以视为 2 个向量(帐户和乘数)之间的点积。
这是获得更好运行时性能的代码:
import java.util.Arrays;
import java.util.stream.IntStream;
public class CheckDigitCalculationImprovementOrOptimization {
public static void main(String[] args) {
String accountNo = "08060002506";
int[] multiplier = {2, 1, 8, 7, 6, 5, 4, 3, 2, 1};
int[] accountNoArr = StringToIntArray(accountNo);
int result = dotProduct(multiplier, accountNoArr);
System.out.println(result);
}
private static int dotProduct(int[] v1, int[] v2) {
return IntStream.range(0, v1.length)
.parallel()
.map( id -> v2[id] * v1[id])
.reduce(0, Integer::sum);
}
static int[] StringToIntArray(String str) {
return Arrays.stream(str.split("\\B"))
.mapToInt(Integer::valueOf)
.toArray();
}
}
另一个优化步骤:您可以提前准备将帐户从字符串转换为 int 数组。我建议运行多个线程来执行此任务。您应该创建一个 int 数组列表,使用帐户大小进行初始化(如果此大小不是常量,则对所有数组使用最大大小)。每个线程将负责用转换后的字符串填充固定数量的帐户。
加入来自这些线程的所有任务后,使用相同的技术在向量之间执行点积。每个线程将在固定数量的账户和给定的乘数之间执行点积。
选择线程数很棘手,取决于各个任务的运行时间。微调方法可能很有用。
添加回答
举报