Мне очень нравится идея.
Для грубой скорости вы бы использовали массивный оператор switch
. Код был бы большим, но не было бы ничего быстрее:
public static boolean isNeighbour(char key1, char key2) {
switch (key1) {
case 'a':
return key2 == 'w' || key2 == 'e' || key2 == 'd' || key2 == 'x' || key2 == 'z';
case 'd':
return key2 == 's' || key2 == 'w' || key2 == 'f' || key2 == 'c' || key2 == 'x';
// etc
default:
return false;
}
}
Вот «стандартный» способ сделать это, который все еще должен работать хорошо:
private static final Map<Character, List<Character>> neighbours =
new HashMap<Character, List<Character>>() {{
put('s', Arrays.asList('a', 'w', 'e', 'd', 'x', 'z'));
put('d', Arrays.asList('s', 'e', 'w', 'f', 'c', 'x'));
// etc
}};
public static boolean isNeighbour(char key1, char key2) {
List<Character> list = neighbours.get(key1);
return list != null && list.contains(key2);
}
Этот алгоритм не использует тот факт, что если a isneighbour b
, то b isneighbour a
, а скорее жертвует размером данных для простоты кода.