我如何改进嵌套的if-else语句,例如在下面的代码示例中(数字不是必需的,只是示例):
boolean a, b;
int result = 0;
if (a && b) {
result = 3;
} else if (a) {
result = 1;
} else if (b) {
result = 2;
}
这可能会以某种方式写得更好吗?或者你认为它是否正常?
答案 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 && !b
,result = y
需要!a && b
,result = 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
代表false
,1
代表true
),第二个代表b
值。之后,您可以通过以下方式获得结果:
int result = res[a == true ? 1 : 0][b == true ? 1 : 0];
在这种特殊情况下,将if-else
语句转换为矩阵似乎是多余的,但在a
和b
的大量不同变体的情况下({{1}时) }和a
是整数或字符;无论具有比b
更大的可能值范围,它都可以显着提高代码的可读性。