我有一个我控制的主字符串,称之为字符串A.然后我有另一个不断变化的字符串在我的控制之外,称之为字符串B.我需要A来包含B中所有的东西,在正确的顺序。
这就是B的行为方式:一开始,新文本从上到下显示(如果您编写word文档,通常会显示文本的方式)。然后,在一个随机点,它包装,新文本再次从顶部开始,覆盖之前的内容。
如果不是因为B包裹并且在写入一定数量的字节后从顶部开始,我可以用定时器以给定的间隔复制整个字符串。相反,我必须使用某种比较,将B从A从上到下进行比较。当它在B中发现一个与A不同的字节时,它应该从B中复制从该点到结尾的所有内容,并将其写入A的底部。
如果行为不清楚,我在下面输入了一个例子。任何代码 - 我如何能做到这一点的例子将非常感激。
String B: abc
String A: abc
String B: abcde
String A: abcde
String B: fgh
String A: abcdefgh
String B: fghijk
String A: abcdefghijk
etc...
只是为解决方案添加我自己的想法:我尝试使用游标方法来解决它,但是当文本被包装到顶部时它就崩溃了。我不知道如何做比较方法。我查看了String.Compare,但它只返回它是大还是小。我想我可以手动进行逐字节比较,但这似乎非常低效,特别是当字符串变得非常大时。
编辑(澄清):如果文字出现在B中,之前出现在B中,它仍应包含在A中。
编辑(澄清2):为了清楚,我无法控制包含字符串B的进程,我被迫定期轮询它(使用计时器或真正快速循环)。
马格努斯
答案 0 :(得分:1)
算法的基本思路:
从A的末尾向后检查减去B的长度,而不是B的开头,从B中删除已添加的内容,然后将其余部分添加到A.
这应该将每个“单词”从B附加到A的末尾,减去恰好与A的最后部分重叠的B的任何部分(我希望我更多地解释了这个问题或更不正确)。
示例:说B是“DEFGH”,到目前为止,A已记录:“ABCDEF”。
比较算法将按如下方式迭代:
D - - - - // Only check D first, from end of A - length(B)
A B C D E F // No match!
D - - - - // Move B ahead 1, still no match
A B C D E F
D - - - - // Move B ahead 1, one match now.
A B C D E F
结果:
不匹配的例子:
D E F L M N O ...
A B C D X Y D E F
此处,B中的E
和F
与A中的X
和Y
不匹配,因此请将B中的D
与{X
进行比较。 1}},然后是Y
等,直到您到达A中的第二个D
。此时,您会在A中找到D E F
的匹配项,而在B中找到其余的L M N O
({ {1}})已准备好附加到A.