从数组中删除项目
Remove item from array
如何删除数组中间的一项?我试过这个:
Public Sub RemoveArrayElement(AryVar() As Object, ByVal RemoveWhich As Long)
Dim byteLen As Byte
byteLen = 4
If RemoveWhich < UBound(AryVar) Then
CopyMemory ByVal VarPtr(AryVar(RemoveWhich)), ByVal _
VarPtr(AryVar(RemoveWhich + 1)), (byteLen) * _
(UBound(AryVar) - RemoveWhich)
End If
If UBound(AryVar) = LBound(AryVar) Then
Erase AryVar
Else
ReDim Preserve AryVar(UBound(AryVar) - 1)
End If
End Sub
但是当我从 aryvar
检索项目时,它 returns Nothing
。
与您在上面采用的方法有点不同,但是您不能将所有值打乱并随后缩小数组吗?
例如:
Public Sub RemoveArrayElement(AryVar() As Object, ByVal RemoveWhich As Long)
If UBound(AryVar) > 0 Then
Dim i As Integer
For i = LBound(AryVar) To UBound(AryVar) - 1
If i >= removeWhich Then
AryVar(i) = AryVar(i + 1)
End If
Next
ReDim Preserve AryVar(UBound(AryVar) - 1)
End If
End Sub
还有另一种方法:
'1 form with:
' 1 command button: name=Command1
Option Explicit
Private Sub Command1_Click()
Dim intIndex As Integer
'dim an array with undefined boundaries
Dim intArray() As Integer
'set boundaries
ReDim intArray(10) As Integer
'fill array with values
For intIndex = 0 To 10
intArray(intIndex) = intIndex * intIndex
Next intIndex
'show the data from the initial array
ShowArray intArray
'remove the 6th item (index=5)
intArray = RemoveItem(5, intArray)
'show the data of the resulting array (with the 6h item removed)
ShowArray intArray
End Sub
Private Function RemoveItem(intItem As Integer, intSrc() As Integer) As Integer()
Dim intIndex As Integer
Dim intDest() As Integer
Dim intLBound As Integer, intUBound As Integer
'find the boundaries of the source array
intLBound = LBound(intSrc)
intUBound = UBound(intSrc)
'set boundaries for the resulting array
ReDim intDest(intLBound To intUBound - 1) As Integer
'copy items which remain
For intIndex = intLBound To intItem - 1
intDest(intIndex) = intSrc(intIndex)
Next intIndex
'skip the removed item
'and copy the remaining items, with destination index-1
For intIndex = intItem + 1 To intUBound
intDest(intIndex - 1) = intSrc(intIndex)
Next intIndex
'return the result
RemoveItem = intDest
End Function
Private Sub ShowArray(intArray() As Integer)
Dim intIndex As Integer
'print all items to the form to show their value
For intIndex = LBound(intArray) To UBound(intArray)
Print "Item " & CStr(intIndex) & " : " & CStr(intArray(intIndex))
Next intIndex
'print an empty line to separate the arrays in displaying
Print
End Sub
区别:
- return 数组而不是传递 byref
- 使用变暗到合适大小的临时数组,而不是最后保留 redim 的临时数组
- 复制保留相同索引的项目,只移动删除项目之后的项目
好吧,这段代码可能会对您有所帮助。
Dim remove_place As Integer
Dim ar() As Integer
Dim n As Integer
n = 10
ReDim ar(n) 'Initial size of an array
remove_place = Val(Text1.Text) 'This is the position to be deleted
For i = remove_place To n - 1
ar(i) = ar(i + 1) 'This loop will shift array position one place to the left. This way the number at your position will be replaced by the next number.
Next
ReDim Preserve ar(n - 1) 'I guess you know what it means.
放在任意事件过程下。
如何删除数组中间的一项?我试过这个:
Public Sub RemoveArrayElement(AryVar() As Object, ByVal RemoveWhich As Long)
Dim byteLen As Byte
byteLen = 4
If RemoveWhich < UBound(AryVar) Then
CopyMemory ByVal VarPtr(AryVar(RemoveWhich)), ByVal _
VarPtr(AryVar(RemoveWhich + 1)), (byteLen) * _
(UBound(AryVar) - RemoveWhich)
End If
If UBound(AryVar) = LBound(AryVar) Then
Erase AryVar
Else
ReDim Preserve AryVar(UBound(AryVar) - 1)
End If
End Sub
但是当我从 aryvar
检索项目时,它 returns Nothing
。
与您在上面采用的方法有点不同,但是您不能将所有值打乱并随后缩小数组吗?
例如:
Public Sub RemoveArrayElement(AryVar() As Object, ByVal RemoveWhich As Long)
If UBound(AryVar) > 0 Then
Dim i As Integer
For i = LBound(AryVar) To UBound(AryVar) - 1
If i >= removeWhich Then
AryVar(i) = AryVar(i + 1)
End If
Next
ReDim Preserve AryVar(UBound(AryVar) - 1)
End If
End Sub
还有另一种方法:
'1 form with:
' 1 command button: name=Command1
Option Explicit
Private Sub Command1_Click()
Dim intIndex As Integer
'dim an array with undefined boundaries
Dim intArray() As Integer
'set boundaries
ReDim intArray(10) As Integer
'fill array with values
For intIndex = 0 To 10
intArray(intIndex) = intIndex * intIndex
Next intIndex
'show the data from the initial array
ShowArray intArray
'remove the 6th item (index=5)
intArray = RemoveItem(5, intArray)
'show the data of the resulting array (with the 6h item removed)
ShowArray intArray
End Sub
Private Function RemoveItem(intItem As Integer, intSrc() As Integer) As Integer()
Dim intIndex As Integer
Dim intDest() As Integer
Dim intLBound As Integer, intUBound As Integer
'find the boundaries of the source array
intLBound = LBound(intSrc)
intUBound = UBound(intSrc)
'set boundaries for the resulting array
ReDim intDest(intLBound To intUBound - 1) As Integer
'copy items which remain
For intIndex = intLBound To intItem - 1
intDest(intIndex) = intSrc(intIndex)
Next intIndex
'skip the removed item
'and copy the remaining items, with destination index-1
For intIndex = intItem + 1 To intUBound
intDest(intIndex - 1) = intSrc(intIndex)
Next intIndex
'return the result
RemoveItem = intDest
End Function
Private Sub ShowArray(intArray() As Integer)
Dim intIndex As Integer
'print all items to the form to show their value
For intIndex = LBound(intArray) To UBound(intArray)
Print "Item " & CStr(intIndex) & " : " & CStr(intArray(intIndex))
Next intIndex
'print an empty line to separate the arrays in displaying
Print
End Sub
区别:
- return 数组而不是传递 byref
- 使用变暗到合适大小的临时数组,而不是最后保留 redim 的临时数组
- 复制保留相同索引的项目,只移动删除项目之后的项目
好吧,这段代码可能会对您有所帮助。
Dim remove_place As Integer
Dim ar() As Integer
Dim n As Integer
n = 10
ReDim ar(n) 'Initial size of an array
remove_place = Val(Text1.Text) 'This is the position to be deleted
For i = remove_place To n - 1
ar(i) = ar(i + 1) 'This loop will shift array position one place to the left. This way the number at your position will be replaced by the next number.
Next
ReDim Preserve ar(n - 1) 'I guess you know what it means.
放在任意事件过程下。