gpt4 book ai didi

.net - 数组的滑动窗口(移位)

转载 作者:行者123 更新时间:2023-12-01 01:02:55 30 4
gpt4 key购买 nike

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

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

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

真的,我正在寻找类似移位寄存器的东西...

例如,当我输入“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

最佳答案

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

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

编辑 自从我开始写这个答案后,您就编辑了您的问题。看来您已经开发出一个非常接近于此的解决方案。我仍然建议使用这样的东西。这将比在每次插入时移动数组中的每个项目更有效。

关于.net - 数组的滑动窗口(移位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18045473/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com