2010-01-22 2 views
6

누구나 US_ENGLISH 표준 키보드의 키 입력이 주어진 인접 키를 제공 할 수있는 라이브러리 (Java가 선호)를 알고 있습니까?입력 키가 주어진 경우 인접 키를 찾기위한 키보드 레이아웃 라이브러리 (자바 선호)

예. 문자 'd'를 입력하면 [w, e, r, s, f, x, c, v]와 같은 문자가 반환됩니다.

그리드 조작 api도 작동합니다 (그리하여 QWERTY 키보드 레이아웃으로 그리드를 인스턴스화하고 이웃을 찾기 위해 사용할 수 있습니다).

참고 1 : '문자'와 '키'라는 단어를 동의어로 사용하여 문자를 나타냅니다.

참고 2 : 50 개 정도의 기본 키를 이웃 사람에게 매핑하는 방법을 하드 코딩 할 수 있음을 알고 있습니다. 나는 더 나은 해결책을 찾고있다.

감사합니다.

답변

6

나는 BlueNovember에 동의하지만 좀 더 "수학적"해결책을 원한다면이 점을 확인하십시오. 먼저 문자의 격자를 만들고 당신은 ... 일종의 쓸모가 전달 된 키에서의 거리보다 작은 2를 가지 모두를 반환하지만 좋은 운동 :이 작업을 수행 할 때

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

감사합니다. getNeighboringKeys 메소드는 더 적은 연산을 수행하도록 최적화 될 수 있습니다. – hashable

+0

최적화는 시도하고 최적화하는 추가 시간을 정당화하기에는 너무 작은 성능 향상을 가져올 것입니다. 나는 그리드에 80 개 또는 그 이하의 키가 존재 함을 의미하며 거의 호출하지 않습니다. 하지만 내 손님이되고 최적화 된 버전을 게시하면 :) –

1

나는 이것을 포기하고 사용자가 적절하게 인접한 키를 선택할 수있게했습니다. 이 project에서 enum Key은 각 명령을 keyCode에 연결하고 은 사용자가 매핑을 변경할 수있게합니다. 결과는 Preferences에 저장됩니다. 이 경우, 라이브러리가 아래 일을 할 것입니다 무엇을 주 2

보다 더 나은 솔루션이 없다면 내가 놀랄 것

0

? 열쇠는 당신이 만들 수있는 서로 관계가 없습니다.

+0

다른 LOCALE (예 : US_ENGLISH/FRENCH) 또는 키보드 유형 (예 : DVORAK/QWERTY)에 대해 다른 결과를 반환하는 라이브러리가 있다고 생각했습니다. – hashable

+1

충분합니다. 귀하의 질문은 특별히 US_ENGLISH를 진술합니다. 로케일은 문제가 될 것입니다. 영국의 로케일을 사용하는 영국 키보드 사용자로서 나의 로케일을 US로 설정하면 my \ 키는 여전히 같은 위치에 있지만 운영 체제는 키보드의 다른 위치에있는 US 키보드의 \로 간주합니다. – RJFalconer

0

하는주의입니다 . 예를 들어 프랑스에있는 경우 D 옆에 ZERSFXCV가 있고 WERSFXCV는 아닙니다. Dvorak을 사용한다면 YFGIHXBM입니다. 터키에 계시다면 567 루크 일 수도 있습니다.

+0

예. 이것이 내가 존재하는 라이브러리를 사용하고 싶었던 이유입니다. – hashable