2016-07-06 3 views
3

Я нахожусь в процессе написания приложения для Android, которое тратит много времени на разрешение Локатора/Долгота на UTM coordinates. Мой текущий код для создания письма UTM зоны идет как этогоИзбегание нескольких утверждений if..elseif

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 и т. Д., Я не смог добиться больших успехов.

Возможно ли более элегантный подход?

+1

Не беспокойтесь о производительности, если вы не знаете, что это узкое место, 16 else-ifs может быть очень дешевым по сравнению с другими вещами, которые делает ваше приложение. Я буду беспокоиться о читаемости и ремонтопригодности вашего решения. @AndyTurner предложил ответ, который касается обоих. – majk

+1

Несвязанный: соглашение об именовании java предлагает вам написать имена переменных в нижнем регистре верблюда, с нижним регистром первого символа. [Подробная информация о сайте oracle] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) – jhamon

+1

Ваше изменение не имеет того же поведения, что и исходный код. Если 'lat' -75, он возвращает 'X' вместо 'C'. Я не знаю, что вы хотели, но это стоит проверить. Я не думаю, что редактирование когда-либо вернет «C». – Holloway

ответ

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

возможно, с некоторым зажимом для того, чтобы Lat в подходящем диапазоне (альтернатива является бросать исключение, так как UTM не определен за пределами этого диапазона):

ClampedLat = Math.min(Math.max(Lat, -80), 84); 
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 и Xs по мере необходимости.

Удобная графическая ссылка для проверки действительности результата - UTM grid chart. Я закодировал свой собственный тест here.