【发布时间】:2021-06-29 03:44:07
【问题描述】:
我有一种将罗马数字转换为常用十进制的方法。我在这里使用了一个循环和许多“如果”条件。 我的 IDE 中的 SonarLint 告诉我,此方法的认知复杂度为 33,而允许为 15。 我怎样才能减少这种情况?我不介意如何解决这个问题。期待您的推荐!
public static int roman2Decimal(String roman) {
int decimal = 0;
char previous = 0;
for (int x = 0; x < roman.length(); x++) {
if (roman.charAt(x) == 'I')
decimal += 1;
if (roman.charAt(x) == 'V') {
System.out.println(previous);
if (previous == 'I') {
decimal -= 2;
}
decimal += 5;
}
if (roman.charAt(x) == 'X') {
if (previous == 'I') {
decimal -= 2;
}
decimal += 10;
}
if (roman.charAt(x) == 'L') {
if (previous == 'X') {
decimal -= 20;
}
decimal += 50;
}
if (roman.charAt(x) == 'C') {
if (previous == 'X') {
decimal -= 20;
}
decimal += 100;
}
if (roman.charAt(x) == 'D') {
if (previous == 'C') {
decimal -= 200;
}
decimal += 500;
}
if (roman.charAt(x) == 'M') {
if (previous == 'C') {
decimal -= 200;
}
decimal += 1000;
}
previous = roman.charAt(x);
}
return decimal;
}
【问题讨论】:
-
认知复杂度与方法长度或逻辑分支(if 语句)的嵌套有关。你最好使用
switch作为roman.charAt(x)表达式。至少。
标签: java optimization code-complexity