减少switch语句的圈复杂度

h9vpoimq  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(590)

我的ide将以下方法标记为具有太高的圈复杂度。我的学校要求我消除ide在代码中可能出现的所有警告,所以我想知道在这种情况下是否有一种简单的方法可以做到这一点。
对于上下文,代码应该选择一个游戏板上的哪一列字段,其中的列标记为a到o,一个给定的字符代表哪一列字段。

  1. public int getColumn(final char c) {
  2. switch (c) {
  3. case 'A':
  4. return 0;
  5. case 'B':
  6. return 1;
  7. case 'C':
  8. return 2;
  9. case 'D':
  10. return 3;
  11. case 'E':
  12. return 4;
  13. case 'F':
  14. return 5;
  15. case 'G':
  16. return 6;
  17. case 'H':
  18. return 7;
  19. case 'I':
  20. return 8;
  21. case 'J':
  22. return 9;
  23. case 'K':
  24. return 10;
  25. case 'L':
  26. return 11;
  27. case 'M':
  28. return 12;
  29. case 'N':
  30. return 13;
  31. case 'O':
  32. return 14;
  33. default:
  34. return -1;
  35. }
  36. }```
s5a0g9ez

s5a0g9ez1#

可以使用Map:

  1. Map<Character, Integer> columnMap = ImmutableMap
  2. .of('A', 0, 'B', 1, 'C',3);//Or any other initialization way
  3. public int getColumn(final char c) {
  4. return columnMap.getOrDefault(c, -1);//-1 default value if letter not found
  5. }

或者,如果您只想获取大写字母在字母表中的位置,请使用以下命令:

  1. public int getColumn(final char c) {
  2. return (int)c - 'A';
  3. }
fafcakar

fafcakar2#

我不确定这是否适用于您的上下文,但为什么不直接使用ascii字符表呢?
你可以把它转换成一个整数,因为大写的字符是索引65,你可以从中减去65。
例如:

  1. public int getColumn(final char c) {
  2. int index = (int) c;
  3. if (index > (int) 'O') {
  4. return -1;
  5. }
  6. return index - (int) 'A';
  7. }
bz4sfanl

bz4sfanl3#

使用hashmap将字符存储为键,将数字存储为值。
参考https://www.w3schools.com/java/java_hashmap.asp 使用hashmap

jhdbpxl9

jhdbpxl94#

或者滥用字符表示为数字的事实:

  1. public int getColumn(final char c) {
  2. if((c >= 'A') && (c <= 'O')) {
  3. return c - 'A';
  4. }
  5. else {
  6. return -1;
  7. }
  8. }

相关问题