将旧值数组位掩码按值匹配规则映射到新值数组的实现问题
旧值数组bitmask按规则移位实现问题
我需要将旧值数组对应的bitmask按规则移位到新值数组的对应位置,规则为相同值第二次匹配时自动跳过。当前第一版实现仅第一个测试用例运行异常,其余用例正常,更新后的第二版代码输出仍与预期存在偏差,求正确实现方案。
原有代码与测试用例
txtUndoPlaintext.Text = Replace(txtUndoPlaintext.Text, " ", " ") txtUndoPlaintext.Text = txtUndoPlaintext.Text.TrimStart(CChar(" ")) txtUndoPlaintext.Text = txtUndoPlaintext.Text.TrimEnd(CChar(" ")) Dim UniqueList() As Byte = Split(txtUndoPlaintext.Text, " ").[Select](Function(n) Byte.Parse(n)).ToArray() txtPlainText.Text = Replace(txtPlainText.Text, " ", " ") txtPlainText.Text = txtPlainText.Text.TrimStart(CChar(" ")) txtPlainText.Text = txtPlainText.Text.TrimEnd(CChar(" ")) Dim OriginalUniqueList() As Byte = Split(txtPlainText.Text, " ").[Select](Function(n) Byte.Parse(n)).ToArray() txtUndoBitMask.Text = Replace(txtUndoBitMask.Text, " ", " ") txtUndoBitMask.Text = txtUndoBitMask.Text.TrimStart(CChar(" ")) txtUndoBitMask.Text = txtUndoBitMask.Text.TrimEnd(CChar(" ")) bitmask = Split(txtUndoBitMask.Text, " ").[Select](Function(n) Byte.Parse(n)).ToArray() Dim newbitmask() As Byte = Nothing Array.Resize(newbitmask, bitmask.Length) 'Array.Copy(bitmask, newbitmask, bitmask.Length) bitmaskCounter = 0 For i = 0 To UniqueList.Length - 1 For j = (i + 1) To OriginalUniqueList.Length - 1 If OriginalUniqueList(i) = UniqueList(j) Then Exit For End If Next j 'If OriginalUniqueList(i) = UniqueList(i) Then ' bitmaskCounter += 1 ' Continue For ' End If 'If OriginalUniqueList(j) = UniqueList(j) Then 'bitmaskCounter += 1 'Continue For 'End If If (j < OriginalUniqueList.Length - 1) AndAlso newbitmask(i) = 1 AndAlso newbitmask(j) = 1 AndAlso bitmask(bitmaskCounter) = 1 Then newbitmask(i) = 1 newbitmask(j) = 1 ElseIf (j > OriginalUniqueList.Length - 1) AndAlso bitmask(bitmaskCounter) = 1 Then newbitmask(i) = 1 ElseIf (j < OriginalUniqueList.Length - 1) AndAlso OriginalUniqueList(i) = UniqueList(i) Then newbitmask(i) = 0 ElseIf bitmask(bitmaskCounter) = 1 Then newbitmask(j) = 1 End If bitmaskCounter += 1 Next
错误示例
旧值数组(value before): 1 2 1 3 2 4 3 8 2 2 1 3 4 2 1 2 新值数组(value after): 1 2 4 3 1 2 3 4 3 2 1 8 2 1 2 2 旧bitmask(old): 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 预期新bitmask(new): 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 匹配结果: 下标2→4 = 正常 下标3→8 = 异常 [此处逻辑出错] 下标7→11 = 正常
正常运行示例
示例1
旧值数组: 1 2 3 1 2 3 4 1 2 3 4 新值数组: 1 2 3 4 1 2 3 4 1 2 3 旧bitmask: 0 0 0 1 0 0 1 0 0 0 0 新bitmask: 0 0 0 0 1 0 0 1 0 0 0 匹配结果: 下标3→4 = 正常 下标6→7 = 正常
示例2
旧值数组: 1 2 1 3 2 3 2 4 新值数组: 1 2 4 1 2 3 2 3 旧bitmask: 0 0 1 1 0 1 0 0 新bitmask: 0 0 0 1 0 1 0 1 匹配结果: 下标2→3 = 正常 下标3→5 = 正常 下标5→7 = 正常
示例3
旧值数组: 1 2 1 3 2 新值数组: 1 2 1 2 3 旧bitmask: 0 0 1 1 0 新bitmask: 0 0 1 0 1 匹配结果: 下标2→2 = 正常 下标3→4 = 正常
第二版更新代码
Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click Dim bitmaskCounter As Integer = 0 Dim UniqueList() As Byte = Split("1 2 1 3 2 4 3 8 2 2 1 3 4 2 1 2", " ").[Select](Function(n) Byte.Parse(n)).ToArray() Dim OriginalUniqueList() As Byte = Split("1 2 4 3 1 2 3 4 3 2 1 8 2 1 2 2", " ").[Select](Function(n) Byte.Parse(n)).ToArray() Dim TheValues = New List(Of Byte)(UniqueList) bitmask = Split("0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0", " ").[Select](Function(n) Byte.Parse(n)).ToArray() Dim newbitmask() As Byte = Nothing Array.Resize(newbitmask, bitmask.Length) 'Array.Copy(bitmask, newbitmask, bitmask.Length) bitmaskCounter = 0 Dim i As Integer = 0 Dim j As Integer = 0 Dim ignoreOldOffsets As New List(Of Short) Dim ignoreNewOffsets As New List(Of Short) Dim found As Boolean = False While i >= 0 found = False Do While j > 0 If j = OriginalUniqueList.Length Then Exit Do If OriginalUniqueList(j) = UniqueList(i) Then found = True Exit Do End If j += 1 Loop If bitmaskCounter >= bitmask.Length Then Exit While If j = i AndAlso OriginalUniqueList(j) = UniqueList(i) OrElse j = OriginalUniqueList.Length Then bitmaskCounter += 1 ignoreOldOffsets.Add(i) ignoreNewOffsets.Add(j) j = i + 1 i += 1 Continue While End If If ignoreOldOffsets.Contains(i) AndAlso ignoreNewOffsets.Contains(j) Then bitmaskCounter += 1 j = i Continue While End If 'If OriginalUniqueList(j) = UniqueList(j) Then 'bitmaskCounter += 1 'Continue For 'End If 'newbitmask(i) = 1 'newbitmask(j) = 1 'ignoreOffsets.Add(i) 'ignoreOffsets.Add(j) If bitmask(i) = 1 Then newbitmask(i) = 1 newbitmask(j) = 1 ignoreOldOffsets.Add(i) ignoreNewOffsets.Add(j) End If bitmaskCounter += 1 i += 1 j = i End While 'Fixed bits output to textbox. txtOutput.Text += "New Bits: " For i = 0 To newbitmask.Length - 1 txtOutput.Text += newbitmask(i) & " " Next txtOutput.Text += vbCrLf 'Reset bitmaskCounter. bitmaskCounter = 0 End Sub
第二版运行偏差
预期旧bitmask: 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 预期新bitmask: 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 第二版实际输出: 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0
内容的提问来源于stack exchange,提问作者SSpoke
相关产品推荐
相关产品推荐

