Java 避免多个if..elseif语句
我正在编写一个Android应用程序,它花费大量的时间来解析经纬度。我目前建立UTM区域的代码如下Java 避免多个if..elseif语句,java,if-statement,Java,If Statement,我正在编写一个Android应用程序,它花费大量的时间来解析经纬度。我目前建立UTM区域的代码如下 if (Lat<-72) Letter='C'; else if (Lat<-64) Letter='D'; else if (Lat<-56) Letter='E'; else if (Lat<-48) Letter='F'; else if (Lat<-40) Letter='G'; else if (Lat<-32) Letter='H'; else if
if (Lat<-72) Letter='C';
else if (Lat<-64) Letter='D';
else if (Lat<-56) Letter='E';
else if (Lat<-48) Letter='F';
else if (Lat<-40) Letter='G';
else if (Lat<-32) Letter='H';
else if (Lat<-24) Letter='J';
else if (Lat<-16) Letter='K';
else if (Lat<-8) Letter='L';
else if (Lat<0) Letter='M';
else if (Lat<8) Letter='N';
else if (Lat<16) Letter='P';
else if (Lat<24) Letter='Q';
else if (Lat<32) Letter='R';
else if (Lat<40) Letter='S';
else if (Lat<48) Letter='T';
else if (Lat<56) Letter='U';
else if (Lat<64) Letter='V';
else if (Lat<72) Letter='W';
else Letter='X';
if(纬度)
可能需要一些钳制,以确保Lat
处于合适的范围内(另一种方法是引发异常,因为UTM未定义在此范围之外):
(代表问题作者发布答案)
为了让其他遇到这个问题的人受益:根据答案@AndyTurner,我最终做了以下工作:
public static char testIt(double lat)
{
return "CCCDEFGHJKLMNPQRSTUVWXXX".charAt((int)(Math.ceil((lat + 90)/ 8)));
}
这里有一个解释:
- 添加90可以确保我们处理的是一个很好的0-180范围,可以以一种更整洁的方式处理,并且可能比使用
Math.min/max
- 低于-72度时,区域字母始终为C,高于72度时,区域字母始终为X。我们不是通过加入
if..
测试来处理这些问题,而是根据需要,通过填充额外的Cs和X来人为地扩展区域字母的任一端范围
检查结果有效性的一个方便的图形参考是。我已经编写了自己的测试。不要担心性能,除非您知道这是一个瓶颈,否则16个其他ifs与您的应用程序正在做的其他事情相比可能非常便宜。我会担心您的解决方案的可读性和可维护性。@AndyT厄纳提出了一个解决这两个问题的答案。不相关:java命名约定建议您用小写字母写变量名,以小写字母开头。您的编辑行为与原始代码不同。如果lat
为-75,它将返回“X”而不是“C”。我不知道您想要的是哪一个,但它值得正在检查。我认为编辑永远不会返回“C”。@Holloway-我更正的代码处理了这个问题。
ClampedLat = Math.min(Math.max(Lat, -80), 84);
public static char testIt(double lat)
{
return "CCCDEFGHJKLMNPQRSTUVWXXX".charAt((int)(Math.ceil((lat + 90)/ 8)));
}