2010-01-22 78 views
6

有誰知道一個庫(最好是java),可以給我的相鄰鍵給予US_ENGLISH標準鍵盤的鍵輸入?鍵盤佈局庫找到給定輸入鍵(java優先)的鄰接鍵

E.g.如果我輸入字符 '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 2010-01-23 00:50:30

+0

優化會產生過小的性能提升,以證明額外的時間去嘗試和優化它。我的意思是,只有80鍵在網格或多或少,你很少會調用這個。不過是我的客人,如果你做到這一點:) – 2010-02-12 11:38:24

0

我會感到驚訝,如果有一個解決方案比注2:

什麼將庫中的下面做的更好,如果不是這個?鑰匙與彼此之間沒有任何關係,您可以從中建立。

+0

我正在考慮爲不同LOCALE(例如US_ENGLISH/FRENCH)或鍵盤類型(例如DVORAK/QWERTY)返回不同結果的庫。 – hashable 2010-01-23 00:41:22

+1

夠公平的。雖然你的問題明確指出US_ENGLISH。場所將會有問題;如果我作爲與英國語言環境的UK鍵盤的用戶,設置我的區域設置爲美國,我\關鍵還是在同一個地方,但操作系統會看到它從美國鍵盤,這是鍵盤上的其他地方\。 – RJFalconer 2010-01-23 10:00:00

0

要小心,當你做到這一點。例如,如果你在法國,D旁邊是ZERSFXCV,而不是WERSFXCV。如果你使用德沃夏克,那就是YFGIHXBM。如果你在土耳其,可能是567ORUTK。

+0

是張貼的優化版本。這就是爲什麼我想要使用圖書館的原因。 – hashable 2010-01-23 04:59:56