3 回答

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