7,765
社区成员
发帖
与我相关
我的任务
分享
Option Explicit
Function Test(a As Variant, n As Long, Length As Long) As Boolean()
Dim minIdx As Long, maxIdx As Long
Dim i As Long
ReDim flag(Length) As Boolean
'找出第n列的最大最小值(如果可可知道数组的极值,这个循环可以省略)
For i = 1 To Length
If a(minIdx, n) > a(i, n) Then minIdx = i
If a(maxIdx, n) < a(i, n) Then maxIdx = i
Next
ReDim tmp(a(minIdx, n) To a(maxIdx, n)) As Long
'标志n列有重复的行
For i = 0 To Length
tmp(a(i, n)) = tmp(a(i, n)) + 1
If tmp(a(i, n)) > 1 Then
flag(i) = True
End If
Next
Test = flag
End Function
Private Sub Command1_Click()
Dim Length As Long
Dim i As Long
Dim Idx As Long
Dim Arr1(2, 1) As Long, Arr2(1, 1) As Long
Dim Bol1() As Boolean
Dim Bol2() As Boolean
'生成测试数组
Arr1(0, 0) = 12: Arr1(0, 1) = 33
Arr1(1, 0) = 10: Arr1(1, 1) = 18
Arr1(2, 0) = 36: Arr1(2, 1) = 33
Arr2(0, 0) = 11: Arr2(0, 1) = -2
Arr2(1, 0) = 10: Arr2(1, 1) = 18
'先将二个数组全部数据加入一个数组
Length = UBound(Arr1, 1) + UBound(Arr2, 1) + 1
ReDim Arr(Length, 1)
For i = 0 To UBound(Arr1, 1)
Arr(i, 0) = Arr1(i, 0)
Arr(i, 1) = Arr1(i, 1)
Next
Idx = i
For i = 0 To UBound(Arr2, 1)
Arr(i + Idx, 0) = Arr2(i, 0)
Arr(i + Idx, 1) = Arr2(i, 1)
Next
'分别测试各列的重复情况
Bol1 = Test(Arr, 0, Length)
Bol2 = Test(Arr, 1, Length)
'根据重复情况重新定义数组(可惜Redim Preserve不能修改一维,不然可少一个循环)
Idx = 0
For i = 0 To Length
If Not (Bol1(i) And Bol2(i)) Then
Idx = Idx + 1
End If
Next
'结果数组
ReDim Result(Idx, 1)
Idx = 0
For i = 0 To Length
If Not (Bol1(i) And Bol2(i)) Then
Result(Idx, 0) = Arr(i, 0)
Result(Idx, 1) = Arr(i, 1)
Idx = Idx + 1
End If
Next
'输出结果
For i = 0 To UBound(Result)
Debug.Print Result(i, 0); Result(i, 1)
Next
End Sub
不想了,不然没完没了....
Function Test(a As Variant, n As Long, Length As Long) As Boolean()
Dim minIdx As Long, maxIdx As Long
Dim i As Long
ReDim flag(Length) As Boolean
'找出第n列的最大最小值(如果可以知道数组的极值,这个循环可以省略)
For i = 1 To Length
If a(minIdx, n) > a(i, n) Then minIdx = i
If a(maxIdx, n) < a(i, n) Then maxIdx = i
Next
ReDim tmp(a(minIdx, n) To a(maxIdx, n)) As Long
'标志n列有重复的行
For i = 0 To Length
tmp(a(i, n)) = tmp(a(i, n)) + 1
If tmp(a(i, n)) > 1 Then
flag(a(i, 2)) = True
End If
Next
Test = flag
End Function
Private Sub Command1_Click()
Dim Length As Long
Dim i As Long
Dim Idx As Long
Dim Arr1(2, 1) As Long, Arr2(1, 1) As Long
Dim Bol1() As Boolean
Dim Bol2() As Boolean
'生成测试数组
Arr1(0, 0) = 12: Arr1(0, 1) = 33
Arr1(1, 0) = 10: Arr1(1, 1) = 18
Arr1(2, 0) = 36: Arr1(2, 1) = 33
Arr2(0, 0) = 11: Arr2(0, 1) = -2
Arr2(1, 0) = 10: Arr2(1, 1) = 18
'先将二个数组全部数据加入一个数组,第二维的第三个元素标志Index(通俗的说是行号)
Length = UBound(Arr1, 1) + UBound(Arr2, 1) + 1
ReDim Arr(Length, 2)
For i = 0 To UBound(Arr1, 1)
Arr(i, 0) = Arr1(i, 0)
Arr(i, 1) = Arr1(i, 1)
Arr(i, 2) = i
Next
Idx = i
For i = 0 To UBound(Arr2, 1)
Arr(i + Idx, 0) = Arr2(i, 0)
Arr(i + Idx, 1) = Arr2(i, 1)
Arr(i + Idx, 2) = Idx + i
Next
'分别测试各列的重复情况
Bol1 = Test(Arr, 0, Length)
Bol2 = Test(Arr, 1, Length)
'根据重复情况重新定义数组(可惜Redim Preserve不能修改一维,不然可少一个循环)
Idx = 0
For i = 0 To Length
If Not (Bol1(i) And Bol2(i)) Then
Idx = Idx + 1
End If
Next
'结果数组
ReDim Result(Idx, 1)
Idx = 0
For i = 0 To Length
If Not (Bol1(i) And Bol2(i)) Then
Result(Idx, 0) = Arr(i, 0)
Result(Idx, 1) = Arr(i, 1)
Idx = Idx + 1
End If
Next
'输出结果
For i = 0 To UBound(Result)
Debug.Print Result(i, 0); Result(i, 1)
Next
End Sub
Function Test(a As Variant, n As Long, Length As Long) As Boolean()
Dim minIdx As Long, maxIdx As Long
Dim i As Long, j As Long
Dim Idx As Long
'找出n维的最大最小值
For i = 1 To Length
If a(minIdx, n) > a(i, n) Then minIdx = i
If a(maxIdx, n) < a(i, n) Then maxIdx = i
Next
ReDim tmp(a(minIdx, n) To a(maxIdx, n)) As Long
'记录是否重复
For i = 0 To Length
tmp(a(i, n)) = tmp(a(i, n)) + 1
Next
'标志n维重复的行
ReDim flag(Length) As Boolean
For i = a(minIdx, n) To a(maxIdx, n)
j = Length
Do While tmp(i) > 1
If a(j, n) = i Then
flag(a(j, 2)) = True
tmp(i) = tmp(i) - 1
End If
j = j - 1
Loop
Next
Test = flag
End Function
Private Sub Command1_Click()
Dim Length As Long
Dim i As Long
Dim Idx As Long
Dim Arr1(2, 1) As Long, Arr2(1, 1) As Long
Dim Bol1() As Boolean
Dim Bol2() As Boolean
'生成测试数组
Arr1(0, 0) = 12: Arr1(0, 1) = 33
Arr1(1, 0) = 10: Arr1(1, 1) = 18
Arr1(2, 0) = 36: Arr1(2, 1) = 33
Arr2(0, 0) = 11: Arr2(0, 1) = -2
Arr2(1, 0) = 10: Arr2(1, 1) = 18
Length = UBound(Arr1, 1) + UBound(Arr2, 1) + 1
'先将全部数据加入一个数组,第二维的第三个元素标志Index(通俗的说是行号)
ReDim Arr(Length, 2)
For i = 0 To UBound(Arr1, 1)
Arr(i, 0) = Arr1(i, 0)
Arr(i, 1) = Arr1(i, 1)
Arr(i, 2) = i
Next
Idx = i
For i = 0 To UBound(Arr2, 1)
Arr(i + Idx, 0) = Arr2(i, 0)
Arr(i + Idx, 1) = Arr2(i, 1)
Arr(i + Idx, 2) = Idx + i
Next
'分别测试各维的重复情况
Bol1 = Test(Arr, 0, Length)
Bol2 = Test(Arr, 1, Length)
'根据重复情况重新定义数组
Idx = 0
For i = 0 To Length
If Bol1(i) And Bol2(i) Then
Arr(i, 2) = -1
Else
Idx = Idx + 1
End If
Next
'结果数组
ReDim Result(Idx, 1)
Idx = 0
For i = 0 To Length
If Arr(i, 2) <> -1 Then
Result(Idx, 0) = Arr(i, 0)
Result(Idx, 1) = Arr(i, 1)
Idx = Idx + 1
End If
Next
'输出结果
For i = 0 To UBound(Result)
Debug.Print Result(i, 0); Result(i, 1)
Next
End Sub
DWORD VB_InStr(DWORD lpStart, char * lpString1, char * lpString2)
{
DWORD i = 0;
DWORD j = 0;
DWORD isret = 0;
DWORD PrimaryLenB = VB_LenB(lpString1);
DWORD FindLenB = VB_LenB(lpString2);
DWORD WordCount = 0;
DWORD IsStart = 0;
for(i=0;i<PrimaryLenB;i++){
if(lpStart==WordCount){
IsStart = 1;
}
if(IsStart==1){
isret=1;
for(j=0;j<FindLenB;j++){
if(lpString1[i+j]!=lpString2[j]){
isret=0;
break;
}
}
if(isret==1){
WordCount++;
return WordCount;
break;
}
}
WordCount++;
if((BYTE)lpString1[i]>=0xA0){
//属于中文字符
i++;
}
}
return 0;
}
Function InStr_Array(ByVal funStart As Long, _
ByRef funBytes() As Byte, _
ByVal funFind As String) As Long
'==================== 变量定义 ====================
Dim byteFindArray() As Byte
Dim lngBytesCount As Long
Dim lngFindCount As Long
Dim lngIsFind As Long
Dim i As Long
Dim j As Long
On Error Resume Next ' 开始设置错误陷阱,防止程序发生意外错误而崩溃
'==================== 初始化变量 ====================
InStr_Array = -1
'==================== 校验输入参数 ====================
'---------- 校验搜索条件参数 ----------
If Len(funFind) = 0 Then
Exit Function
End If
'---------- 校验搜索内容参数 ----------
lngBytesCount = UBound(funBytes)
If Err.Number <> 0 Then
Err.Clear
Exit Function
End If
byteFindArray = StrConv(funFind, vbFromUnicode)
lngFindCount = UBound(byteFindArray)
'---------- 校验搜索位置参数 ----------
If funStart + lngFindCount > lngBytesCount Then
Exit Function
End If
'==================== 开始搜索数据 ====================
For i = funStart To lngBytesCount
lngIsFind = 1
For j = 0 To lngFindCount
If funBytes(i + j) < &HA0 And byteFindArray(j) < &HA0 Then
If UCase(Chr(funBytes(i + j))) <> UCase(Chr(byteFindArray(j))) Then
lngIsFind = 0
Exit For
End If
Else
If funBytes(i + j) <> byteFindArray(j) Then
lngIsFind = 0
Exit For
End If
End If
Next j
If lngIsFind = 1 Then
InStr_Array = i
Exit For
End If
Next i
End Function
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Sub Command1_Click()
Dim Array1() As POINTAPI
Dim Array2() As POINTAPI
Dim Array3() As POINTAPI
Dim lngArray1Count As Long
Dim lngArray2Count As Long
Dim lngAddCount As Long
Dim IsRepeated As Long
Dim i As Long
Dim j As Long
Dim StartCount As Long
Dim EndCount As Long
ReDim Array1(2)
ReDim Array2(1)
Array1(0).x = 12
Array1(0).y = 33
Array1(1).x = 10
Array1(1).y = 18
Array1(2).x = 36
Array1(2).y = 33
Array2(0).x = 11
Array2(0).y = -2
Array2(1).x = 10
Array2(1).y = 18
StartCount = GetTickCount
Dim strKey$, lngCount&
strKey = " "
For i = 0 To UBound(Array1)
If InStr(strKey, " " & Array1(i).x & "," & Array1(i).y & " ") = 0 Then
ReDim Preserve Array3(lngCount)
Array3(lngCount) = Array1(i)
lngCount = lngCount + 1
strKey = strKey & Array1(i).x & "," & Array1(i).y & " "
End If
Next
For i = 0 To UBound(Array2)
If InStr(strKey, " " & Array2(i).x & "," & Array2(i).y & " ") = 0 Then
ReDim Preserve Array3(lngCount)
Array3(lngCount) = Array2(i)
lngCount = lngCount + 1
strKey = strKey & Array2(i).x & "," & Array2(i).y & " "
End If
Next
EndCount = GetTickCount
'输出
Debug.Print "耗时:" & EndCount - StartCount & " 毫秒"
For i = 0 To UBound(Array3)
Debug.Print Array3(i).x & "," & Array3(i).y
Next i
End Sub
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Sub Command1_Click()
Dim Array1() As POINTAPI
Dim Array2() As POINTAPI
Dim lngArray1Count As Long
Dim lngArray2Count As Long
Dim lngAddCount As Long
Dim IsRepeated As Long
Dim i As Long
Dim j As Long
Dim StartCount As Long
Dim EndCount As Long
ReDim Array1(2)
ReDim Array2(1)
Array1(0).x = 12
Array1(0).y = 33
Array1(1).x = 10
Array1(1).y = 18
Array1(2).x = 36
Array1(2).y = 33
Array2(0).x = 11
Array2(0).y = -2
Array2(1).x = 10
Array2(1).y = 18
StartCount = GetTickCount
'先剔除自身重复数据
DelRepeated Array1
DelRepeated Array2
lngArray1Count = UBound(Array1)
lngArray2Count = UBound(Array2)
lngAddCount = lngArray1Count
ReDim Preserve Array1(lngArray1Count + lngArray2Count + 1)
For i = 0 To lngArray2Count
IsRepeated = 0
For j = 0 To lngArray1Count
If Array2(i).x = Array1(j).x Then
If Array2(i).y = Array1(j).y Then
IsRepeated = 1
Exit For
End If
End If
Next j
If IsRepeated = 0 Then
lngArray1Count = lngArray1Count + 1
Array1(lngArray1Count).x = Array2(i).x
Array1(lngArray1Count).y = Array2(i).y
End If
Next i
ReDim Preserve Array1(lngArray1Count)
EndCount = GetTickCount
'输出
Debug.Print "耗时:" & EndCount - StartCount & " 毫秒"
For i = 0 To UBound(Array1)
Debug.Print Array1(i).x & "," & Array1(i).y
Next i
End Sub
Private Sub DelRepeated(ByRef tmpArray() As POINTAPI)
Dim i As Long
Dim j As Long
Dim k As Long
Dim lngArrayCount As Long
lngArrayCount = UBound(tmpArray)
For i = 0 To lngArrayCount - 1
For j = i + 1 To lngArrayCount
If tmpArray(i).x = tmpArray(j).x Then
If tmpArray(i).y = tmpArray(j).y Then
If j < lngArrayCount Then
For k = j To lngArrayCount
tmpArray(j).x = tmpArray(k).x
tmpArray(j).y = tmpArray(k).y
Next k
End If
tmpArray(lngArrayCount).x = 0
tmpArray(lngArrayCount).y = 0
lngArrayCount = lngArrayCount - 1
End If
End If
Next j
Next i
ReDim Preserve tmpArray(lngArrayCount)
End Sub