2014-05-14 20 views
0
if (i <= 33) { 
      variable = x; 
     } else if (i > 33 && i <= 66) { 
      variable = y; 
     } else { 
      variable = z; 
     } 

有没有办法缩短这一点?在这种情况下,我找不到如何使用三元运算符。有没有办法缩短这段代码?也许是一个三元的表达?

+0

什么数据类型是'我',你可以给范围的任何限制?我想你可以做一些像'variable = {x,y,z} [i/33]' – MickLH

+0

我是一个int,范围从0到100 – user3610410

+0

我会删除'i> 33 &&'单独。如果它仍然“太复杂”,只需将其隐藏在一个方法中 - 那么它是一个单行调用:'variable = toNearestSegment(i);'。 – user2864740

回答

9

如果你想使用一些疯狂的嵌套ternaries:

int variable = i <= 33 ? x : i > 33 && i <= 66 ? y : z 

...但不这样做。改变你的代码的可读性和可维护性!

此外,作为@EJP提到in his answer(你应该因此给予好评),该i > 33条件是多余的,所以你可以缩短这:

int variable = i <= 33 ? x : i <= 66 ? y : z 

我只是抓住了条款从您的if/else直接。

+8

+1'但是不要这样做。' –

+0

@JonathonReinhart我在我的制作环境中看到过这样的代码。调试并不好玩。 :) – asteri

+0

如果你必须设置一个断点,你不能在三元组上做到这一点。 – vkg

0

您可以通过反转比较方向,而不三元操作简化:

if (i > 66) 
{ 
    variable = z; 
} 
else if (i > 33) 
{ 
    variable = y; 
} 
else 
{ 
    variable = x; 
} 

但正如其他人指出,可以简化比较条件无方向反转。

+1

您可以但不必扭转方向,如[EJP显示](http://stackoverflow.com/a/23644807/119527)。 –

+0

我没有说你必须扭转。这只是一种方式:) –

+0

但它是你提到的唯一方法。 – EJP

0

您可以使用ternery运营商,如:

if (i <= 33) { 
     variable = x; 
    } else { 
     variable = (i <= 66) ? y : z; 
    } 

但我认为这是比你有什么更糟糕。

注意,是因为它已经被else

3
if (i <= 33) { 
     variable = x; 

暗示此时ii > 33可以被删除是<= 33.

} else if (i > 33 && i <= 66) { 

在这一点上,我们是在“其他”,其中i > 33由施工,所以你不需要再次测试。

 variable = y; 
    } else { 
     variable = z; 
    } 

所以,你可以这样减少:由于您使用的是else子句

if (i <= 33) { 
     variable = x; 
    } else if (i <= 66) { 
     variable = y; 
    } else { 
     variable = z; 
    } 
+1

关于'> 33'多余的好处。 +1 – asteri

-1

,你不必对证33两次:

if (i <= 33) { 
    variable = x; 
} else if (i <= 66) { 
    variable = y; 
} else { 
    variable = z; 
} 
+2

冗余。 [EJP的答案](http://stackoverflow.com/a/23644807/119527)已经证明了这一点。 –

+0

@JonathonReinhart当我发布时,EJP的回答是不可见的。 –

+0

它*是*,但您的页面没有刷新。时间戳不会说谎。 –

1
if (i <= 33) variable = x; 
    else if (i <= 66) variable = y; 
    else variable = z; 

由于每个子句只有一个语句,因此可省略大括号,并将语句带到该子句的同一行。

0

如果存储xy,并且z在数组中,你可以使用划分来访问阵列,这将是更快,特别是如果你知道你的病情为界,在此情况下的不同元素,0和100。

index = Math.min(Math.max((i-1)/33, 0), 2); 
variable = x[index]; 

如果i不能小于0或大于100,这将成为:

index = (i-1)/33; 
variable = x[index]; 
1

授予可理解你可以先解压缩到一个方法,那么: *使用第一个答案 *如果你想让它更可以理解的,你可以做到这一点

private Object valuePerState(int i){ 
    if (i<33) return x; 
    if (i>66) return y; 
    return z; 
} 

BTW一步缩短您的问题是削减唐e测试33你完成扭曲

0

我似乎迟到了派对,但无论如何。这是我使用链式三元运算符的方式。在我看来这是相当可读的。

variable = i <= 33 ? x 
     : i <= 66 ? y 
     : z ; 

由于运营商和空白的位置,这种方法也与版本控制效果很好:你在中间坚持任何新的条件简直就是在差异中新行,留下其他条件不变。另外,如果有那么多的操作员让你感到紧张,你当然可以在条件中加上括号。

相关问题