2010-01-22 11 views
6

¿Alguien sabe de una biblioteca (preferiblemente java) que me puede dar claves vecinas dada una entrada clave para el teclado estándar US_ENGLISH?biblioteca de diseño de teclado para encontrar claves vecinas dada una clave de entrada (preferible para java)

E.g. si ingreso el caracter 'd', debería obtener los siguientes caracteres devueltos: [w, e, r, s, f, x, c, v].

Como alternativa, una API de manipulación de cuadrícula también funcionaría (para poder instanciar una cuadrícula con un diseño de teclado qwerty y usarla para encontrar mis vecinos).

Nota 1: Estoy usando las palabras 'personaje' y 'clave' sinónimo de referirme a los caracteres.

Nota 2: Sé que puedo codificar un método para asignar las claves principales de 50 o más a sus vecinos. Estoy buscando una mejor solución.

Gracias.

Respuesta

6

Estoy de acuerdo con BlueNovember, pero en caso de que quiera una solución más "matemática", consulte esto. En primer lugar se crea una cuadrícula de caracteres y luego volver a todos ellos que tiene una distancia menor que 2 de la llave pasada ... Un poco inútil, sino que es un buen ejercicio :)

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; 
    } 
} 
+0

Gracias. El método getNeighboringKeys podría optimizarse para hacer menos operaciones. – hashable

+0

La optimización arrojaría un impulso de rendimiento demasiado pequeño como para justificar el tiempo adicional para intentar optimizarlo ... Quiero decir que solo hay 80 teclas más o menos en la cuadrícula y esto se llama rara vez. Pero sé mi invitado y publica la versión optimizada si lo haces :) –

1

Dejé de hacer esto y simplemente dejé que el usuario elija qué teclas son adecuadamente adyacentes. En este project, un enum Key relaciona cada comando con un keyCode, y this dialog le permite al usuario cambiar la asignación. El resultado se guarda en Preferences.

0

Me sorprendería si hay una solución mejor que la Nota 2.

¿Cómo sería la biblioteca estará haciendo por debajo, si no es esto? Las claves no tienen ninguna relación entre sí que pueda construir.

+0

Estaba pensando en una biblioteca que arroja un resultado diferente para un LOCALE (por ejemplo, US_ENGLISH/FRENCH) o tipo de teclado (por ejemplo, DVORAK/QWERTY). – hashable

+1

Bastante justo. Sin embargo, su pregunta indica específicamente US_ENGLISH. La configuración regional será problemática; si yo, como usuario del teclado del Reino Unido con configuración regional del Reino Unido, configuré mi ubicación en EE. UU., mi \ tecla sigue en el mismo lugar, pero el sistema operativo lo vería como \ desde el teclado estadounidense, que está en el teclado. – RJFalconer

0

Tenga cuidado al hacer esto . Por ejemplo, al lado de D están ZERSFXCV, no WERSFXCV si estás en Francia. Y si usas Dvorak, es YFGIHXBM. Si estás en Turquía, podría ser 567ORUTK.

+0

Sí. Es por eso que quería usar una biblioteca si existiera. – hashable

Cuestiones relacionadas