避免多个if..elseif语句

时间:2016-07-06 08:48:32

标签: java if-statement

我正在编写一款Android应用,花费大量时间将纬度/经度解析为UTM coordinates。我目前建立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 (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';

虽然这有效但似乎是一种非常低效的东西方式。我的大多数用户都在U区,这意味着应用程序在建立正确的区域字母之前执行了16次失败的if..elseif测试。

通过调整if..elseifs的顺序轻松设置?没错,但我不得不想到必须有一个更清洁的方法来做到这一点。我仍然是一个Java新手,所以虽然已经尝试过HashMaps等,但我没有取得多大进展。

可能有更优雅的方法吗?

2 个答案:

答案 0 :(得分:8)

  char Letter = "CDEFGHJKLMNPQRSTUVWX".charAt((int)((Lat + 80) / 8);

可能需要进行一些限制以确保Lat处于合适的范围内(另一种方法是抛出异常,因为在此范围之外未定义UTM):

  ClampedLat = Math.min(Math.max(Lat, -80), 84);

答案 1 :(得分:0)

(代表作者提问回答)

为了其他任何遇到这个问题的人的利益:基于@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填充它。

用于检查结果有效性的便捷图形参考是UTM grid chart。我编写了自己的测试here