滑动窗口(移位)的数组

时间:2013-08-04 17:15:43

标签: .net shift-register

我有一个低级键盘钩子,目前允许我从任何应用程序内部控制媒体播放器,包括游戏。

通过查看捕获的特定击键来工作。

我想扩展它以寻找键的组合。我可以对一些逻辑进行硬编码,但我觉得必须采用更合乎逻辑的方式。

真的,我正在寻找像移位寄存器......

例如,当我输入“BlahPlay”时,我想要一个可以像这样使用的结构......

[_,_,_,_]
[_,_,_,B]
[_,_,B,l]
[_,B,l,a]
[B,l,a,h]
[l,a,h,P]
[a,h,P,l]
[h,P,l,a]
[P,l,a,y] <-- detect "Play"

没有循环和移动数组中的项目,这是正确的方法吗?

我现在能想到的最好的就是......

Private Register(4) As Char
Private Position = 0 

Sub Add(Character as Char)
    Register(Position) = Character
    Position = (Position + 1) Mod Register.Length
End Sub

Function Get() as String
    Dim Ret As New StringBuilder
    For i = Position To Position + Register.Length
        Ret.Append(Register(i Mod Register.Length)
    Next
    Return Ret.ToString
End Function

1 个答案:

答案 0 :(得分:1)

而不是移动缓冲区中的项目,您可以创建标准数组,只需将每个项目插入下一个位置,根据需要循环。请考虑以下代码:

var buffSize = 4;
var position = 0;
var buffer = new char[buffSize];

现在,您只需在position处插入每个新字符,并在每次输入新密钥时设置position = (position + 1) % buffSize。假设您键入abcPlay,缓冲区将为:

[_,_,_,_] position = 0
[a,_,_,_] position = 1
[a,b,_,_] position = 2
[a,b,c,_] position = 3
[a,b,c,P] position = 0
[l,b,c,P] position = 1
[l,a,c,P] position = 2
[l,a,y,P] position = 3

这意味着,而不是简单地从position的开头读取每个字符。例如,如果您正在测试缓冲区是否包含Play,那么您必须执行以下操作:

var test = new char[] { 'P', 'l', 'a', 'y' };
int p = (position + buffSize - test.Length) % buffSize;
bool success = true;
for(int i = 0; i < test.Length; i++)
{
    if (buffer[p] != test[i])
    {
        success = false;
        break;
    }

    p = (p + 1) % buffSize;
}

编辑自从我开始撰写此答案以来,您编辑了自己的问题。看来你已经开发了一个非常接近这个的解决方案。我仍然建议你这样做。它比在每个插入上移动数组中的每个项目更有效。