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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 261 fois - Téléchargée 20 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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 72
18 août 2010 à 05:52
assures toi bien que ton tableau n'a pas qu'une seule entree...
andalo Messages postés 103 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
18 août 2010 à 08:52
très juste, je corrige
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
18 août 2010 à 13:18
Bonjour,

Au risque de poser une question stupide (ça ne serait pas la première fois ^^),
en quoi ce code est-il optimisé (c'est une vraie question) ?

Cordialement !
andalo Messages postés 103 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
18 août 2010 à 15:03
Quand je me suis confronté au problème et que j'ai cherché sur ce site je n'ai trouvé que des solutions imposant de créer un deuxième tableau à remplir lors d'une première itération,et une deuxième itération pour re-remplir le premier tableau à partir du deuxième.Comme, pour une fois je me suis trouvé pas trop bête en faisant ca en une seule boucle, j'ai trouvé que ca optimisais un peu.
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
18 août 2010 à 18:34
Je vois, malgré cela tu as quand même deux boucles même si la 2ème est imbriquée dans la 1ère, de plus le ReDim Preserve fais une copie de ton tableau en mémoire ce qui peut s'avérer lourd dans le cas d'un grand tableau.

Personnellement j'utilise une autre méthode, d'ailleurs je ne sais pas trop ce qu'elle vaut, si j'ai le temps je me ferais un petit benchmark mais je la poste ici des fois que...

Sub Remove(Of T)(ByRef source As T(), ByVal toDelete As T)
If source Is Nothing Then Exit Sub
Dim index = Array.IndexOf(Of T)(source, toDelete)
If index = -1 Then Exit Sub
Dim temp(source.Length - 2) As T
Array.ConstrainedCopy(source, 0, temp, 0, index)
Array.ConstrainedCopy(source, index + 1, temp, index, source.Length - index - 1)
source = temp
End Sub

Cordialement !

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.