Repérage des doublons

Résolu
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011 - 9 nov. 2011 à 08:37
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011 - 9 nov. 2011 à 15:34
Bonjour,

je suis un débutant en VB6 et je me remets à vous car j’espère que vous m'aiderez à devenir meilleur. Je vous remercie d'avance

J'ai un autre problème au qu'elle je crois avoir trouvé la solution mais je ne pense pas que cette solution soit optimale.

En fait j'ai un tableau supposons de taille 30 et je souhaite comparer toutes les valeurs de ce tableau afin de repérer les doublons. Pour le faire, j'ai écris le code ci-dessous

Dim TabRessources(30) as Interger 
Dim i as Integer 

for i=1 to 30 
   if TabRessources(i) = TabRessources(i+1) then 
      TabRessources(i+1)=0 
   elseif TabRessources(i) = TabRessources(i+2) then 
      TabRessources(i+2)=0 
   elseif TabRessources(i) = TabRessources(i+3) then 
      TabRessources(i+3)=0 
      . 
      . 
      . 
   elseif TabRessources(i) = TabRessources(i+30) then 
      TabRessources(i+30)=0 
   end if 
Next i 


le problème ici est que si par exemple mon tableau est de taille 1000 faire ce code va s'avérer fastidieux.

J'aimerai svp avoir qlqs pistes pour savoir comment optimiser ce code

merci

Cordialement

William

12 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 nov. 2011 à 12:50
Bonjour,

Tu peux aussi imbriquer 2 boucles For :
For i=0 to Ubound(MonTab)-1
    For j=i+1 to Ubound(MonTab)
        If MonTab(i)=MonTab(j) Then 'Doublon
    Next
Next


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 nov. 2011 à 10:02
Bonjour,

Le plus simple et le plus rapide est alors d'utiliser un dictionnaire ===>>

Set mondico = CreateObject("Scripting.Dictionary")

For i = 0 To 30
    If mondico.Exists(TabRessources(i)) Then
      TabRessources(i) = 0
    Else
      mondico.Add TabRessources(i), TabRessources(i)
    End If
Next


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011
9 nov. 2011 à 12:35
Merci beaucoup pour votre réponse; mais je ne sais si j'ai réussi à adaptée cette réponse à mon problème.

En fait j'ai 3 tableaux et j'ai écris le code ci-dessous afin de repérer d'un les doublons (meme code ressource) et si jamais il y a un et que l'heure de début de la tache(u+1) est inférieur à l'heure de fin de la tache(u) alors dans ma flexgrid.textmatrix(u+1,2) je mets l'heure de fin de la tache(u)+ 0,5

VOICI CE QUE J'AI ECRIS PRECEDEMENT

Dim TabHeureD as integer
Dim TabHeureF as integer
Dim TabRessources as integer

For u =  1 To 30
      
    If TabHeureD(u + 1) < TabHeureF(u) And TabRessources(u) =             TabRessources(u + 1) Then
         frmRecapAvantOrdo.TextMatrix(u + 1, 2) = (TabHeureF(u) + 0.5)
              
     ElseIf TabHeureD(u + 2) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 2) Then
         frmRecapAvantOrdo.TextMatrix(u + 2, 2) = (TabHeureF(u) + 0.5)
         
     ElseIf TabHeureD(u + 3) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 3) Then
         frmRecapAvantOrdo.TextMatrix(u + 3, 2) = TabHeureF(u) + 0.5
         
     ElseIf TabHeureD(u + 4) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 4) Then
         frmRecapAvantOrdo.TextMatrix(u + 4, 2) = TabHeureF(u) + 0.5
         .
         .
         .
         .  
      ElseIf TabHeureD(u + 30) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 30) Then
         frmRecapAvantOrdo.TextMatrix(u + 30, 2) =  TabHeureF(u) + 0.5
         
      End If
Next u


VOICI L'ADAPTATION

Dim mondico as string

Set mondico   = CreateObject("Scripting.Dictionary")

For u = 0 To 30
    If mondico.Exists(TabRessources(u)) And TabHeureD(u + 1) < TabHeureF(u) Then
       frmRecapAvantOrdo.TextMatrix(u + i, 2) = TabHeureF(u) + 0.5
    'Else
      'mondico.Add TabRessources(i), TabRessources(i)
    End If
Next u


Quand je lance ce code on me dit qu'il y a erreur de compilation et qu'un object est requis...

Aussi j'aimerai savoir si mon adaptation est bonne?

Merci
0
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011
9 nov. 2011 à 12:38
Merci beaucoup pour votre réponse; mais je ne sais si j'ai réussi à adaptée cette réponse à mon problème.

En fait j'ai 3 tableaux et j'ai écris le code ci-dessous afin de repérer d'un les doublons (meme code ressource) et si jamais il y a un et que l'heure de début de la tache(u+1) est inférieur à l'heure de fin de la tache(u) alors dans ma flexgrid.textmatrix(u+1,2) je mets l'heure de fin de la tache(u)+ 0,5

VOICI CE QUE J'AI ECRIS PRECEDEMENT

Dim TabHeureD as integer
Dim TabHeureF as integer
Dim TabRessources as integer

For u =  1 To 30
      
    If TabHeureD(u + 1) < TabHeureF(u) And TabRessources(u) =             TabRessources(u + 1) Then
         frmRecapAvantOrdo.TextMatrix(u + 1, 2) = (TabHeureF(u) + 0.5)
              
     ElseIf TabHeureD(u + 2) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 2) Then
         frmRecapAvantOrdo.TextMatrix(u + 2, 2) = (TabHeureF(u) + 0.5)
         
     ElseIf TabHeureD(u + 3) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 3) Then
         frmRecapAvantOrdo.TextMatrix(u + 3, 2) = TabHeureF(u) + 0.5
         
     ElseIf TabHeureD(u + 4) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 4) Then
         frmRecapAvantOrdo.TextMatrix(u + 4, 2) = TabHeureF(u) + 0.5
         .
         .
         .
         .  
      ElseIf TabHeureD(u + 30) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 30) Then
         frmRecapAvantOrdo.TextMatrix(u + 30, 2) =  TabHeureF(u) + 0.5
         
      End If
Next u


VOICI L'ADAPTATION

Dim mondico as string

Set mondico   = CreateObject("Scripting.Dictionary")

For u = 0 To 30
    If mondico.Exists(TabRessources(u)) And TabHeureD(u + 1) < TabHeureF(u) Then
       frmRecapAvantOrdo.TextMatrix(u + 1, 2) = TabHeureF(u) + 0.5
    'Else
      'mondico.Add TabRessources(i), TabRessources(i)
    End If
Next u


Quand je lance ce code on me dit qu'il y a erreur de compilation et qu'un object est requis...

Aussi j'aimerai savoir si mon adaptation est bonne?

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 nov. 2011 à 13:01
1) Elle ne l'est pas, dès lors que tu supprimes, comme tu l'as fait, l'inscription au dictionnaire
2) tu mélanges tout (ton tableau et apparemment une flexgrid ) !
Ta discussion ne concernait, je te le rappelle, que les doublons d'un tableau ! Et la réponse que tu as reçue concerne donc ce que tu as demandé, tel que demandé !
pour mémoire :
En fait j'ai un tableau supposons de taille 30 et je souhaite comparer toutes les valeurs de ce tableau afin de repérer les doublons

et voilà que tu arrives maintenant avec autre chose.
Ma réponse : une discussion n'est ni un "chat", ni le moyen de traiter plusieurs choses ! Elle est l'exposé d'un seul problème isolé et spécifique et n'"est susceptible de recevoir que la réponse à ce problème spécifique et isolé. Une discussion n'est pas là pour aller "au delà" dans le développement et le suivi d'une application qui n'est( que la tienne et dont nous n'avons pas à connaître les tenants et aboutissants.
Tu as posé un problème ===>> tu as eu la réponse (au demeurant testée) à ce seul problème.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011
9 nov. 2011 à 13:15
Bonjour NHenri,

Merci pour t'as réponse. je l'ai déjà fait et j'ai rencontré le probleme suivant:
Avec cette méthode, la recherche des doublons ne se fait que s'ils sont consécutifs ( u et u+1, u+1 et u+2....). s'ils sont non consécutifs alors elle ne marche plus (u et u+2, u et u+25,.....) et c'est le cas de mes tableaux

je ne sais pas si je me suis fait comprendre?

Merci
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 nov. 2011 à 13:20
Bonjour,

Dbratt, alors, ce n'est pas le même code que tu as testé, car celui-ci détecte les doublons, même s'ils sont non consécutifs.

J'ai utilisé ce format de code assez souvent pour le savoir.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011
9 nov. 2011 à 13:27
Mr. ucfoutu,

je suis d'accord avec vous, j'ai eu la solution au problème que j'ai posé. et je vous en remercie. Je me suis juste dit que une fois connaissant cela je pourrais l'adapter a mon problème.

Pouvez vous donc m'aider a optimiser mon code ci-dessous s'il vous plait connaissant mon reel probleme?

Dim TabHeureD as integer
Dim TabHeureF as integer
Dim TabRessources as integer

For u = 1 To 30
      
    If TabHeureD(u + 1) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 1) Then
         frmRecapAvantOrdo.TextMatrix(u + 1, 2) = (TabHeureF(u) + 0.5)
              
     ElseIf TabHeureD(u + 2) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 2) Then
         frmRecapAvantOrdo.TextMatrix(u + 2, 2) = (TabHeureF(u) + 0.5)
         
     ElseIf TabHeureD(u + 3) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 3) Then
         frmRecapAvantOrdo.TextMatrix(u + 3, 2) = TabHeureF(u) + 0.5
         
     ElseIf TabHeureD(u + 4) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 4) Then
         frmRecapAvantOrdo.TextMatrix(u + 4, 2) = TabHeureF(u) + 0.5
         .
         .
         .
         .  
      ElseIf TabHeureD(u + 30) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 30) Then
         frmRecapAvantOrdo.TextMatrix(u + 30, 2) = TabHeureF(u) + 0.5
         
      End If
Next u 


Cordialement
0
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011
9 nov. 2011 à 13:49
Re-Bonjour NHenri,

je m'excuse ca marche surper bien certainement c moi qui ai fait une erreur quand je l'ai fait.

je me permets de vous poser une autre question! quand j'ecris ceci:

For r = 0 To 29 'UBound(MonTab) - 1
    For e = r + 1 To 30 'UBound(MonTab)
        If TabRessources(r) = TabRessources(e) And TabHeureD(r) < TabHeureF(e) Then
        frmRecapAvantOrdo.TextMatrix(e, 2) = TabHeureF(e) + 0.5
        End If
    Next e
Next r


j'ai une erreur: type de donnees incompatible sur cette ligne (frmRecapAvantOrdo.TextMatrix(e, 2) = TabHeureF(e) + 0.5)

je presume que c parce que j'essaye de remplir une flexgrid avec un tableau est ce la raison? si oui comment contourner cela?

Merci
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 nov. 2011 à 13:54
Bonjour,

Peut être qu'il attend une chaine de caractère et que tu lui envoi un nombre.
Conserves les UBound, comme ça si plus tard, tu changes le nombre d'éléments, tu n'auras pas de problème à ce niveau.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011
9 nov. 2011 à 15:27
Merci, je me doutais bien que c'etait cela ! y a t'il pas des convertisseurs qui convertissent des nombre en texte comme (Val) qui converti le contenu d'un texte en nombre?

Cordialement
0
Dbratt Messages postés 29 Date d'inscription samedi 22 octobre 2011 Statut Membre Dernière intervention 10 novembre 2011
9 nov. 2011 à 15:34
C'est bon j'ai résolu le probleme avec (CStr) Merci pour votre aide.
0
Rejoignez-nous