Это нормально в большинстве случаев, хотя, чтобы сделать его оптимизированным и (IMO) более чистым, вы можете найти функцию, которая связывает входной заголовок с заголовком, используемым на карте.
Например:
(Я почти уверен, что это правильно, но вы захотите проверить это)
45* (int)Math.round(( ((double)x % 360) / 45))
Сначала выполняется x % 360
, чтобы убедиться, что заголовок находится в допустимом диапазоне. тогда
45 * round(.../45)
находит кратное 45.
Теперь измените вашу карту на
HashMap<Integer, String> map = new HashMap<Integer, String>()
map.put(0, "North")
map.put(45, "Northeast")
etc...
Итак, теперь ваш алгоритм становится быстрым математическим вычислением, а не итерацией по карте. Кроме того, вам здесь не нужен Hashtable, поскольку он предоставляет конструкции для параллелизма (если я правильно помню), и в вашем случае это фактически приведет к снижению производительности.
Еще раз, производительность может быть совершенно незначительной для ваших нужд.
Правка для предложений Тило и Синдзина:
Вместо умножения на 45, просто оставьте остаток уравнения, который дает значения от 0 до 7, и создайте массив из ваших строк.
String directions[] = {"N", "NE", "E", "SE", "S", "SW", "W", "NW"}
return directions[ (int)Math.round(( ((double)x % 360) / 45)) % 8 ]
и ваша проблема решена в две строки.
Одно примечание: модуль не будет работать правильно для отрицательных чисел. Если заголовок нашего ввода отрицательный, сначала нужно сделать его положительным.