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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 666 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

Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
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
-
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
-
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
-
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
-
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.