Supprimer un item dans un tableau en le parcourant une seule fois

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 769 fois - Téléchargée 18 fois

Contenu du snippet

il s'agit d'une itération permettant de supprimer un élément d'un tableau ne se trouvant pas à la fin.
Ceci sans création d'un autre tableau et sans parcourir deux fois les éléments du tableau.

Source / Exemple :


dim i as integer
dim j as integer
        For i = 0 To UBound(Tableau())
            If Tableau(i) = LaValeurASupprimmer Then
                if UBound(Tableau())>1 and i<UBound(Tableau()) then
                    For j = i To UBound(Tableau())-1
                        Tableau(j) = Tableau(j + 1)
                    Next
                end if
                ReDim Preserve Tableau(UBound(Tableau()) - 1)
                Exit For
            End If
        Next i

A voir également

Ajouter un commentaire

Commentaires

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
j'ajouterais concernant les Strings qu'il n'y as pas systematiquement de test a faire pour éviter les chaines vides...
tout dépend de ce à quoi l'on déstine le tableau...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
quand je parles de compact, je veux dire de faire la recopie des elements renseignés dans le tableau, en laissant de coté les "cases" vides.
je ne parlais donc pas d'une fonction intégrée quelconque.

Il est possible de faire, donc, un CopyMemory pour décaler rapidement les données.
l'astuce consistera a ne pas redimensionner le tableau tout de suite, et de le faire plus tard (possible de conserver une variable contenant le nombre d'elements du tableau)

Mais bon, il faut bien cibler la problématique, ce n'est pas si courant que cela de devoir supprimer des items d'un tableau.
Messages postés
3
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
19 août 2010

le test supplémentaire prendra toujours moins de temps que les recopiages de tableaux ou encore l'utilisation parfois risquée d'un API

c'est garantit ! j'ai fais des tests de performance par rapport à ça, à cause d'un projet qui utilisait les tableaux de façon presque abusive ^^ le gain de temps est non négligeable
Messages postés
103
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
20 octobre 2012

je ne connaissais pas l'API copymemory, du coup j'ai trouvé ca :

http://www.vbfrance.com/forum/sujet-TABLEAUX-CHAINES-COPYMEMORY-QUAND-POTENCE-VOUS-GUETTE_1234952.aspx

la problématique est d'insérer une valeur mais ca se ressemble. Pour dire vrai j'avoue ne pas avoir pigé comment me servir de ces infos pour le moment.

faire un compact sur un tableau, ca non plus je ne connais pas, Renfield, si tu peux m'éclairer je suis preneur.

la méthode a Khun Dun est tentante. Mais je me demande si c'est si optimisé que ca. au moment de la suppression il n'y a pas photo. Mais au moment de la relecture du tableau, il faut ajouter un test supplémentaire à la lecture de chaque entrée. Le gain est il réel du coup?

Sehnsucht, effectivement il y a deux boucles, mais un seul parcours du tableau, il faut que je change le titre! peut tu expliquer cette ligne :
Dim index = Array.IndexOf(Of T)(source, toDelete)
et surtout a t'elle une équivalence en VB6?
si je comprend bien, elle te permet de retrouver l'index dans le tableau de la valeur a supprimer sans le parcourir.
Messages postés
3
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
19 août 2010

alors dans ce cas je créé un Type

Private Type tInfo
Value As Integer
Tag As Integer
End Type
Private mTableau(10) As tInfo 'on peut faire un tableau variable aussi

ensuite je remplie comme d'habitude mon tableau en utilisant Tableau(Index).Value = [integer]
et lorsque je souhaite effacer une valeur, je remplie le Tag avec par exemple -1
il suffit donc, quand on lit le tableau, de lire que les Tag différents de -1
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.