SUPPRIMER UN ÉLÉMENT D'UN TABLEAU

cs_Worst Messages postés 19 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 13 décembre 2006 - 23 avril 2006 à 20:04
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012 - 25 janv. 2013 à 22:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/232-supprimer-un-element-d-un-tableau

andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
25 janv. 2013 à 22:32
Exit if, ça existe?
OUI IL FONCTIONNE -_-
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
23 janv. 2013 à 21:51
Mieux qu'andalo!est-ce possible?
Plaisanterie mise à part,a tu testé ton code djkarim?
Je me suis arrêté a vb6, mais même si c'est du .net, je ne pense pas que ça fonctionne.
Il y a mieux que ANDALO je pense .. on peut faire encore plus rapide (efficace), les itérations de sa première boucle à partir de l'indice de la valeur à supprimer jusqu'à la fin du tableau sont totalement inutiles, on peut remplacer la boucle pour par Tantque :

dim i as integer
dim j as integer
b as boolean

b:=false;
i:=1;
while (b=false) do
If Tableau(i) = LaValeurASupprimmer Then
For j = i To UBound(Tableau()-1)
Tableau(j) = Tableau(j + 1)
b:=true;
Next j
exit for
exit if
next i
Exit while
ReDim Preserve Tableau(UBound(Tableau()) - 1)
end.
wpjo1956 Messages postés 14 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 22 novembre 2008
6 sept. 2010 à 15:51
On peut faire encore plus lent ?
the_little_big_man Messages postés 86 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 14 février 2011
17 août 2010 à 11:31
la solution de ANDALO est nickel... merci mec
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
13 janv. 2010 à 13:41
Arrêtez moi si je me trompe mais il me semble qu'il y a bien plus simple, et en une seule boucle :

soit un tableau deja rempli, appelons le Tableau
dim i as integer
dim j as integer
For i = 0 To UBound(Tableau())
If Tableau(i) = LaValeurASupprimmer Then
For j = i To UBound(Tableau()-1)
Tableau(j) = Tableau(j + 1)
Next
ReDim Preserve Tableau(UBound(Tableau()) - 1)
Exit For
End If
Next i
cs_Worst Messages postés 19 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 13 décembre 2006
16 nov. 2007 à 18:00
Je voyais le truc tout simple : créer un 2ème tableau avec directement la bonne taille (max - 1), et mettre dedans les valeurs au fur et à mesure. Mais effectivement, à la fin faut le remettre dans le 1er tableau, et là on est comme des flans.

Y'a bien l'option "on crée une fonction qui retourne le nouveau tableau", mais là ça doit être VB qui crée une copie du tableau avant de le retourner...

Public Function array_remove(ByRef t() As String, ByVal val As String)

Dim max As Integer ' Taille de l'ancien tableau
max = UBound(t)

Dim cur_val As String ' Valeur lue dans l'ancien tableau
Dim ind_anc As Integer ' Indice de déplacement dans l'ancien tableau
Dim ind_nouv As Integer ' Indice de déplacement dans le nouveau tableau

Dim nouv_tab() As String ' Nouveau tableau
ReDim Preserve nouv_tab(max - 1)

ind_nouv = 0
For ind_anc = 0 To max
cur_val = t(ind_anc)
If cur_val <> val Then
nouv_tab(ind_nouv) = cur_val
ind_nouv = ind_nouv + 1
End If
Next ind_anc

array_remove = nouv_tab

End Function

'''''''' Exemple ''''''''

Dim t(10) As String
For i = 0 To 10
t(i) = i
Next i

nouv_t = array_remove(t, 5)

Dim val As Variant
For Each val In nouv_t
Debug.Print val
Next

Donc, finalement je suis d'accord, y'a 2 parcours. J'ai dit des bêtises. Au temps pour moi.
Par contre, juste : pourquoi tu mets plein de UBound() dans tes boucles for() ? Ca serait pas plus efficace de récupérer la taille une première fois avant d'entrer dans la boucle, plutôt que de le recalculer à chaque fois ??
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
16 nov. 2007 à 12:18
Oups... et donc je code de Simboy n'est pas si mauvais que ça. Mais je peux me tromper..
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
16 nov. 2007 à 12:14
Worst, je suis un peu d'accord mais dans ton idée il faut bien renvoyé le tableau sans l'item. Comment vois-tu la chose ?

zieut ca :
Dim i As Integer
Dim k As Integer

'Creation du tableau temporaire
Dim tbTemp() As String 'doit être idem que tb :(
ReDim tbTemp(UBound(Tabl))

For i = 0 To UBound(Tabl)
If i <> item Then
'on copie dans le nouveau tableau sauf l'item a effacer
tbTemp(k) = Tabl(i)
k = k + 1
End If
Next

'on refait le tableau de base
ReDim Tabl(UBound(tbTemp))
For i = 0 To UBound(tbTemp)
Tabl(i) = tbTemp(i)
Next
floppeur Messages postés 6 Date d'inscription mardi 8 avril 2003 Statut Membre Dernière intervention 16 avril 2007
7 mai 2007 à 12:24
Bonjour,

Je trouve que même si la source de simboy n'est pas optimiser (comme dit Worst), elle fait appel a une structure de donnée orienté objet que je trouve très intéressante. Comme par exemple pour la gestion d'un panier de produits...

Alors Merci bien..

Sanyohan13: Tu es dans la mauvais rubrique, mais pour ton probléme block avec maxlength...
sanyohan13 Messages postés 7 Date d'inscription mardi 2 mai 2006 Statut Membre Dernière intervention 23 mars 2009
8 juin 2006 à 11:48
salut
je débute et je voudrais savoir comment faire pour écrire seulement "1234567890ABCDEF" et que les autres caractères ne s'écrivent pas m^me si on appuie dessus...
merci
cs_Worst Messages postés 19 Date d'inscription vendredi 22 février 2002 Statut Membre Dernière intervention 13 décembre 2006
23 avril 2006 à 20:04
Bonjour,

Je voulais juste dire que je ne suis pas tout à fait d'accord avec la solution proposée. Cette méthode nécessite 2 parcours du tableau.

En effet, la méthode 'Redim Preserve' crée un nouveau tableau et recopie dedans les éléments de l'ancien. En aucun cas il agrandit le tableau existant...

Tiré de MSDN :
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vblr7/html/vastmredim.asp
"Si vous incluez le mot clé Preserve, Visual Basic copie les éléments à partir du tableau existant dans le nouveau tableau."


Je pense qu'il est donc plus efficace de recréer un nouveau tableau en écrivant dedans juste les éléments qui nous intéressent.