Does anyone know of a library (preferably java) that can give me neighboring keys given a key input for US_ENGLISH standard keyboard?
E.g. if I input the character 'd', I should get the following characters returned: [w,e,r,s,f,x,c,v].
Alternatively a grid manipulation api would work too (so that I can instantiate a grid with a qwerty keyboard layout and use it to find my neighbors).
Note 1: I am using the words 'character' and 'key' synonymously to refer to characters.
Note 2: I know I can hard-code a method to map the 50-or-so primary keys to their neighbors. I am looking for a better solution.
Thank You.
I agree with BlueNovember but in case you want a more "mathematical" solution check this. First you create a grid of characters and then you return all of them that has a distance smaller than 2 from the key passed... Kinda useless but it's a nice exercise :)
public class Test {
static String chars = "qwertyuiopasdfghjkl;zxcvbnm,.";
public static void main(String[] args) {
System.out.println(getNeighboringKeys('f'));
System.out.println(getNeighboringKeys('u'));
System.out.println(getNeighboringKeys('m'));
System.out.println(getNeighboringKeys('q'));
}
public static String getNeighboringKeys(char key) {
StringBuffer result = new StringBuffer();
for (char c : chars.toCharArray()) {
if (c!=key && distance(c,key)<2) {
result.append(c);
}
}
return result.toString();
}
public static double distance(char c1, char c2) {
return Math.sqrt(Math.pow(colOf(c2)-colOf(c1),2)+Math.pow(rowOf(c2)-rowOf(c1),2));
}
public static int rowOf(char c) {
return chars.indexOf(c) / 10;
}
public static int colOf(char c) {
return chars.indexOf(c) % 10;
}
}
I gave up on this and just let the user choose what keys are suitably adjacent. In this project an enum Key
relates each command to a keyCode
, and this dialog lets the user change the mapping. The result is saved in Preferences
.
I'd be surprised if there is a solution better than Note 2.
What would the library be doing underneath, if not this? Keys don't have any relationship to each other you can build from.
Be careful when you do this. For example, next to D are ZERSFXCV, not WERSFXCV if you're in France. And if you use Dvorak, it's YFGIHXBM. If you're in Turkey, it might be 567ORUTK.