|
| Slette del af et array Fra : ST |
Dato : 28-09-04 09:20 |
|
Hvordan slette man en del af et array.
TestArray(0)
TestArray(1)
TestArray(2)
TestArray(3)
TestArray(4)
Hvis jeg gerne vil slette TestArray(2) så TestArrayet bliver:
TestArray(0)
TestArray(1)
TestArray(2)
TestArray(3)
I dot.net er der vist en kommando der hedde Remove.
| |
Lars Holm Jensen (28-09-2004)
| Kommentar Fra : Lars Holm Jensen |
Dato : 28-09-04 10:08 |
|
> Hvis jeg gerne vil slette TestArray(2) så TestArrayet bliver:
>
> TestArray(0)
> TestArray(1)
> TestArray(2)
> TestArray(3)
>
> I dot.net er der vist en kommando der hedde Remove.
Det er ikke muligt i VB. Brug Collections, og det ikke er muligt og hvis dit
array aldrig bliver rigtigt stort, så kan du bruge et loop, der flytter
hvert element en plads tilbage. (Det er det, der sker i Java's ArrayList og
sikkert også .NET's datastrukturer, som virker med indexes)
/Lars
| |
ST (28-09-2004)
| Kommentar Fra : ST |
Dato : 28-09-04 19:50 |
|
Så må jeg jo bruge neaterthaler metoden og dumpe arrayet i en fil og så læse
det jeg vil bruge ind igen.
"Lars Holm Jensen" <lhj@larsholm.net> wrote in message
news:415929e8$0$55825$14726298@news.sunsite.dk...
>> Hvis jeg gerne vil slette TestArray(2) så TestArrayet bliver:
>>
>> TestArray(0)
>> TestArray(1)
>> TestArray(2)
>> TestArray(3)
>>
>> I dot.net er der vist en kommando der hedde Remove.
>
> Det er ikke muligt i VB. Brug Collections, og det ikke er muligt og hvis
> dit array aldrig bliver rigtigt stort, så kan du bruge et loop, der
> flytter hvert element en plads tilbage. (Det er det, der sker i Java's
> ArrayList og sikkert også .NET's datastrukturer, som virker med indexes)
>
> /Lars
>
| |
Tomas Christiansen (29-09-2004)
| Kommentar Fra : Tomas Christiansen |
Dato : 29-09-04 20:06 |
|
ST skrev:
> Så må jeg jo bruge neaterthaler metoden og dumpe arrayet i en fil og så
læse
> det jeg vil bruge ind igen.
Hvorfor dog det?
Hvis du bruger et dynamisk array (dvs. du ikke angiver størrelsen ved Dim,
men senere hen med ReDim), kan du med en for-løkke flytte elementerne én op
og bruge ReDim Preserve til at gøre tabellen én mindre.
-------
Tomas
| |
Lars Holm Jensen (30-09-2004)
| Kommentar Fra : Lars Holm Jensen |
Dato : 30-09-04 11:57 |
|
Jeg har lavet en lille implementation af et array med remove-featuren (Så
hurtigt det kan gøres)
Bemærk dog at remove stadig tager O(n),(selv om der ikke er en løkke), og
ikke O(1) som add, set og get.
Her er det implementeret som et Long array, men det kan I jo bare ændre som
I har lyst.
'Class module
Private Declare Sub MemCopy Lib "kernel32" Alias "RtlMoveMemory" (Dest As
Any, Src As Any, ByVal cb&)
Dim myArray() As Long
Public Sub Class_Initialize()
End Sub
Public Sub Class_Terminate()
Erase myArray
End Sub
Public Property Get getValue(ByVal index As Long) As Long
getValue = myArray(index)
End Property
Public Sub addValue(ByVal myValue As Long)
Dim mySize As Long
mySize = size()
If mySize = -1 Then
ReDim Preserve myArray(0)
myArray(0) = myValue
Else
ReDim Preserve myArray(mySize)
myArray(mySize) = myValue
End If
End Sub
Public Sub setValue(ByVal index As Long, ByVal myValue As Long)
If index < size() Then
myArray(index) = myValue
Else
ReDim Preserve myArray(index)
myArray(index) = myValue
End If
End Sub
Public Property Get size() As Long
On Error GoTo emptyarray
size = UBound(myArray) + 1
Exit Property
emptyarray:
size = -1
End Property
Public Function Remove(ByVal index As Long) As Boolean
On Error GoTo Hell
Dim i As Long
Dim mySize As Long
mySize = size()
If mySize = 1 Then
Erase myArray
Remove = True
Exit Function
ElseIf index = (mySize - 1) Then
ReDim Preserve myArray(mySize - 2)
Remove = True
Exit Function
End If
MemCopy myArray(index), myArray(index + 1), Len(myArray(index)) *
(UBound(myArray) - index)
ReDim Preserve myArray(mySize - 2)
Remove = True
Exit Function
Hell:
MsgBox Err.Number & " - " & Err.Description
End Function
/Lars
| |
|
|