2015-05-21 5 views
2

Как удалить элемент в середине массива? Я попытался это:Удалить элемент из массива

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, он возвращает Nothing.

ответ

2

и другой подход:

'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 

различия:

  • вернуть массив вместо передачи ByRef
  • используя временный массив, который затемняется до нужного размера вместо красного Эрве в конце
  • скопировать элементы, которые сохраняют тот же индекс, и только те, которые перемещаются после удаляемого элемента
+0

с помощью CopyMemory может быть быстрее, хотя ... – Hrqls

1

Немного другого подхода, чем тот, который вы используете выше, но не могли бы вы просто перетасовать все значения вниз и сжать массив после этого?

Например:

Public Sub RemoveArrayElement(ByRef AryVar() As Object, ByVal RemoveWhich As Long) 
    If UBound(AryVar) > 0 Then 
     For i As Integer = 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 
+0

Это похоже на vb.net. Вопрос отмечен vb6. –

+0

@ C-PoundGuru это действительно vb6 – tjvg1991

1

Ну Этот фрагмент коды может помочь вам.

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. 

Поместите его в любое удобное для вас время.

+0

Почему есть текстовое поле? У меня нет текстового поля – tjvg1991

+0

Ну, это была просто демонстрация. Я использовал текстовое поле для ввода позиции пользователя через текстовое поле. Вы можете использовать любую другую альтернативу. Это зависит от вас. Эта программа должна была просто продемонстрировать алгоритм «Удалить». –