4

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

boolean a, b;
int result = 0;

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

这能以某种方式写得更好吗?或者你会认为就这样就可以了吗?

4

8 回答 8

12

对于给出的特定数字:

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

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

于 2013-10-31T08:28:13.577 回答
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;
}

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

于 2013-10-31T08:28:51.580 回答
5
if (a) result |= 0x1;
if (b) result |= 0x2;
于 2013-10-31T08:27:12.560 回答
1

这不会多次检查 a 和 b 。

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

或者,由于您要求简短,这里是一行,尽管我更喜欢上面的一行。

result = a ? (b ? 3 : 1) : b ? 2 : 0;
于 2013-10-31T08:27:45.780 回答
1
int result = (a && b) ? 3 : (a) ? 1 : (b) ? 2 : -1; 

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

于 2013-10-31T08:28:48.943 回答
0

您可以制作以下矩阵:

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

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

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

在这种特殊情况下,将if-else语句转换为矩阵似乎是多余的,但在ab(当ab是整数或字符时)有大量不同变化的情况下,boolean它可以显着改善代码的可读性。

于 2013-10-31T10:58:40.947 回答
0

如果想要result = xfor a && !bresult = yfor!a && bresult = zfor a && b,那么:

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

于 2013-10-31T08:55:45.573 回答
0

还有一个答案

result = a ? result+1 : result ;
result = b ? result+2 : result ;
于 2013-10-31T08:33:01.043 回答