使用智能算法缩短 switch case

Shortening a switch case with a smart algorithm

我正在寻找一种智能算法来获得(或多或少)与以下方法相同的结果。

实际上哪个数字得到 returned 并不重要。重要的是 low/high 的每个组合都有一个唯一的 return 值,并且 return 值介于 1 和 36 之间。

idx 介于 0 和 8(9 个值)之间,从不低于,从不高于。

有什么想法吗?

// idx1 is never = idx2
private long getIdentifier(int idx1, int idx2) {
    int low = (idx1>idx2)?idx2:idx1;
    int high = ((idx1>idx2)?idx1:idx2);
    switch (low) {
        case 0:
            return high;
        case 1:
            switch (high) {
                case 2:
                    return 9;
                case 3:
                    return 10;
                case 4:
                    return 11;
                case 5:
                    return 12;
                case 6:
                    return 13;
                case 7:
                    return 14;
                case 8:
                    return 15;
            }
        case 2:
            switch (high) {
                case 3:
                    return 16;
                case 4:
                    return 17;
                case 5:
                    return 18;
                case 6:
                    return 19;
                case 7:
                    return 20;
                case 8:
                    return 21;
            }
        case 3:
            switch (high) {
                case 4:
                    return 22;
                case 5:
                    return 23;
                case 6:
                    return 24;
                case 7:
                    return 25;
                case 8:
                    return 26;
            }
        case 4:
            switch (high) {
                case 5:
                    return 27;
                case 6:
                    return 28;
                case 7:
                    return 29;
                case 8:
                    return 30;
            }
        case 5:
            switch (high) {
                case 6:
                    return 31;
                case 7:
                    return 32;
                case 8:
                    return 33;
            }
        case 6:
            switch (high) {
                case 7:
                    return 34;
                case 8:
                    return 35;
            }
        case 7:
            return 36;
    }
    return 0;
}

您可以将返回值存储在二维数组中。

int[] res = new int[9][9];
...
res[3][8] = 26;
...
return res[low][high];

您可以使用单独的赋值(例如 res[3][8]=26)初始化数组,也可以在一行中初始化数组:

int[] res = {{0,1,2,3,4,5,6,7,8},{...},{...},{...},{...},{...},{...},{...},{...}};

您可以轻松修改二维数组以仅包含您实际使用的位置:

int[] res = {{0,1,2,3,4,5,6,7,8},
             {9,10,11,12,13,14,15},
             {16,17,18,19,20,21},
             {22,23,24,25,26},
             {27,28,29,30},
             {31,32,33},
             {34,35},
             {36}};

现在您需要在访问数组之前测试以下条件:

if (low < high && low < res.length && (high - low - 1) < res[low].length) {
    return res[low][high-low-1];
} else {
    return 0;
}

这就是你想要的:

private static long getIdentifier(int idx1, int idx2) {
  int min = min(idx1, idx2);
  int max = max(idx1, idx2);
  return factor(min) + (max - min);
}

private static long factor(int n) {
  int sum = 0;
  for (int i = 8; i > 8 - n; i--) {
    sum += i;
  }
  return sum;
}

如果 low 为 0,则因子加 0,如果 low 为 1,则加 8,如果 low 为 2,则加 15 等等。可能可以通过给出公式而不是通过循环重新计算来改进它。

示例(准确打印从 1 到 36 的所有数字):

public static void main(String args[]) {
  for (int i = 0; i <= 7; i++) {
    for (int j = i + 1; j <= 8; j++) {
      System.out.println(getIdentifier(i, j));
    }
  }
}

您不需要 switch 语句。

private long getIdentifier(int idx1, int idx2) {
    int low  = idx1>idx2 ? idx2 : idx1;
    int high = idx1>idx2 ? idx1 : idx2;
    return (15-low)*low/2+high;
}

这returns正是原来的方法returns。