如何改进嵌套的if-else语句?

时间:2013-10-31 08:25:18

标签: java algorithm

我如何改进嵌套的if-else语句,例如在下面的代码示例中(数字不是必需的,只是示例):

boolean a, b;
int result = 0;

if (a && b) {
    result = 3;
} else if (a) {
    result = 1;     
} else if (b) {
    result = 2;
}

这可能会以某种方式写得更好吗?或者你认为它是否正常?

8 个答案:

答案 0 :(得分:13)

对于给出的具体数字:

int result = (a ? 1 : 0) + (b ? 2 : 0);

在更一般的情况下,您已编写的代码确实没有太大问题。它非常简洁,清晰易读,易于理解。

答案 1 :(得分:7)

如果你将它放入一个方法中,你可以直接返回它使它更具可读性,它也将这个逻辑移到一个单独的位置:

public int getThing(final boolean a, final boolean b) {
    if (a && b) {
        return 3;
    }
    if (a) {
        return 1;     
    }
    if (b) {
        return 2;
    }
    return 0;
}

我不认为使用二元运算符或三元运算符真的会给你带来很大的收获,除了未来的痛苦,试图弄清楚你做了什么以及你为什么要这样做,比如一年的时间。

答案 2 :(得分:6)

if (a) result |= 0x1;
if (b) result |= 0x2;

答案 3 :(得分:1)

这不会多次检查a和b。

if (a) {
    result = b ? 3 : 1;
} else if (b) {
    result = 2;
}

或者,既然你要求简短,这里有一行,虽然我更喜欢上面那一行。

result = a ? (b ? 3 : 1) : b ? 2 : 0;

答案 4 :(得分:1)

int result = (a && b) ? 3 : (a) ? 1 : (b) ? 2 : -1; 

那个-1很棘手,但我认为你不能说int result;因为原生类型不能是null;

答案 5 :(得分:0)

还有一个答案

result = a ? result+1 : result ;
result = b ? result+2 : result ;

答案 6 :(得分:0)

如果result = x需要a && !bresult = y需要!a && bresult = z需要a && b,那么:

result = (a ? x : 0) + (b ? y : 0) + (a && b ? z - x - y : 0);

答案 7 :(得分:0)

您可以制作以下矩阵:

short[][] res = {{-1,1},{2,3}};

此处第一个索引代表a个值(0代表false1代表true),第二个代表b值。之后,您可以通过以下方式获得结果:

int result = res[a == true ? 1 : 0][b == true ? 1 : 0];

在这种特殊情况下,将if-else语句转换为矩阵似乎是多余的,但在ab的大量不同变体的情况下({{1}时) }和a是整数或字符;无论具有比b更大的可能值范围,它都可以显着提高代码的可读性。