多次击键/多次击打/三次敲击算法

时间:2012-12-10 19:49:07

标签: c# java .net algorithm input

我们的一个自助服务终端应用程序缺少物理键盘,我们需要添加文本条目。由于它只附加了数字键盘,我们认为我们不妨使用旧的手机输入法。我已经能够发现它被称为multitap(go figure),但我找不到任何算法实现。有谁知道吗?

(我不能将输入限制为字典,所以我不能使用类似T9的方法)

3 个答案:

答案 0 :(得分:1)

所以除零之外的每个按钮都以4的增量工作。因此,对某个小键盘数字的点击次数无关紧要,只需将其除以4并取余数,1 =数字,2 =首字母,3 =第二个字母,0 =第三个字母。然后,根据您希望用户使用的符号数量,您可以对键盘0及其符号使用相同的概念

1-A-B-C

2-d-E-F

3-G-H-I

4-J-K-L

5-M-N-O

6-P-Q-R

7-S-T-U

8-V-W-X

9-y-z-WhiteSpace

0 - 符号

答案 1 :(得分:1)

我会使用一个与int结合的计时器来计算水龙头。这是纯伪代码,但会给出基本的想法。

long lastEvent = 0;
int lastNum = 0;
int taps = 0;


eventListener(KeyEventArgs e)
{
    if (e.Value == lastNum)
    {
         if ((DateTime.Now.ToFileTimeUtc() - lastEvent) < AppropriateTimeLimit)
         {
              taps++;
         }
         else
         {
              GetLetter(taps, lastNum);
              lastEvant = DateTime.Now.ToFileTimeUtc();
              taps = 0;
         }
    }
    else
    {
              GetLetter(taps, lastNum);
              lastEvant = DateTime.Now.ToFileTimeUtc();
              taps = 0;
              lastNum = e.Value;
    }
}

char GetLetter(int taps, int num)
{
     if (num == 1)
         return punctuationVals[taps % length -1];
     else if (num == 0)
         return ' '; //from what I remember 0 was for spaces on most phones
     else
     {
         int val;
         if (taps > 3)
             val = taps % 4; // old phones wrap around back to the first char if I press the key 5 times
         else 
             val = taps;
          return values[num][val];
     }

}

char[][] values = new char[9][4]; // statically code all of your chars in these arrays
char[] punctuationVals = new char[idkHowMany];

所以这是设计概述。首先,我们有一个处理所有输入事件的事件监听器。我们知道在两个条件之一下完成了一个轻敲序列1)时间已经过期(如果你记得在旧手机上打字,如果我想输入'abc',我必须按2次,等一下左右,按2两次等待另一秒,按2次三次)或2)按下一个新键。

在任何一种情况下,我们都需要知道按下的最后一个键是什么,所以我们跟踪它。如果键输入与按下的最后一个键不匹配,那么我们可以安全地输出最后按下的键,因此我们调用GetLetter,将抽头重置为0,将最后一个偶数时间设置为现在,并设置{{1刚刚按下的数字。这是一个更简单的案例。

如果有人试图输入'abc',我们需要知道何时区分第一个输入的结束和下一个输入的开始。为此,我们使用计时器。如果第一个水龙头和刚刚发生的水龙头之间的差异在一定限度内(可能是半秒或一秒),那么我们增加水龙头,如果它在它之外,我们决定他们从'a'开始到'b',此时我们经历与用户按下与上一个键不同的键时相同的输出过程,除非我们没有更改最后一个键的值,因为它没有改变。

lastNum是值得讨论的最后一件事。这很简单,你可以为值2-9硬编码2D数组,使索引变得简单,我们将保留0和1但是将它们留空。

意思是,数组类似于;

GetLetter

这使索引更简单, '', '','', '' '', '', '', '' '2', 'a', 'b', 'c' '3', 'd', 'e', 'f' //ect 只返回GetLetter(2, 2),这是正确的'b'。

因为2键上的7次连续点击会产生'c',所以如果它大于3,则对值进行模拟4(因为4%4是0,因此我应该在索引0处产生数字本身)。现在values[2][2]将返回GetLetter(6, 2),这是正确的'b'。

1是一个特例。为此,我们只使用一个具有多个值(可能是20或其他)的一维数组,并且我们对它的输入也做模数,但显然它是基于该数组的长度。我对这种情况的模数可能是错误的,但修复起来很简单。

答案 2 :(得分:0)

它实际上是四按,看着我的电话拨号盘上的字母。

我不知道是否有星号和英镑键的标准,但这些字母可以放在查询表中。

例如,

7 key, three taps, returns R
5 key, one tap, returns J

如果您确实需要这个号码,那就是额外的点击。

7 key, five taps, returns 7

我相信我的古老手机上的英镑钥匙从上到下移动,从下到上移动。还有一个标题案例,会产生一个大写字母并转移到小写字母。

星号键弹出一个标点符号表。您可以使用2,4,6和8键来导航表格并选择一个符号。