3 回答
TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
優(yōu)先使用String.charAt(int)andCharacter.digit(char, int)來(lái)String.split("")解析每個(gè)子字符串(并使用 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貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
優(yōu)先使用String.charAt(int)andCharacter.digit(char, int)來(lái)String.split("")解析每個(gè)子字符串(并使用 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貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
為了優(yōu)化計(jì)算我建議使用流的并行計(jì)算,這是stream api的內(nèi)置功能。
該問(wèn)題可以視為 2 個(gè)向量(帳戶和乘數(shù))之間的點(diǎn)積。
這是獲得更好運(yùn)行時(shí)性能的代碼:
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();
}
}
另一個(gè)優(yōu)化步驟:您可以提前準(zhǔn)備將帳戶從字符串轉(zhuǎn)換為 int 數(shù)組。我建議運(yùn)行多個(gè)線程來(lái)執(zhí)行此任務(wù)。您應(yīng)該創(chuàng)建一個(gè) int 數(shù)組列表,使用帳戶大小進(jìn)行初始化(如果此大小不是常量,則對(duì)所有數(shù)組使用最大大?。?。每個(gè)線程將負(fù)責(zé)用轉(zhuǎn)換后的字符串填充固定數(shù)量的帳戶。
加入來(lái)自這些線程的所有任務(wù)后,使用相同的技術(shù)在向量之間執(zhí)行點(diǎn)積。每個(gè)線程將在固定數(shù)量的賬戶和給定的乘數(shù)之間執(zhí)行點(diǎn)積。
選擇線程數(shù)很棘手,取決于各個(gè)任務(wù)的運(yùn)行時(shí)間。微調(diào)方法可能很有用。
添加回答
舉報(bào)
