Bonjour
j'ai un ensemble des données dans un ListBox le probleme que je veut enlevé les donnés répété.merci d'avance .
Bonjour
j'ai un ensemble des données dans un ListBox le probleme que je veut enlevé les donnés répété.merci d'avance .
Que penses-tu de deux boucle for avec un delete à l'intérieur?
j'ai essayé sa mé sa marche pa
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int r=0; do { for(int n=r+1;n<Form1->ListBox2->Items->Count;n++) { if(Form1->ListBox2->Items->Strings[r]==Form1->ListBox2->Items->Strings[n]) { Form1->ListBox2->Items->Delete(n); } } r=r+1; }while(r<=Form1->ListBox2->Items->Count );
Vous pouvez procéder ainsi, par exemple :
Au moment d’un delete, i pointe, par le fait même, l’occurrence suivante. Comme on sait du fait de cet algorithme qu’avant i, il n’y a pas de doublets, il suffit de réinitialiser à cette occasion j à la valeur de i pour continuer la comparaison des couples.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void __fastcall TForm1::Button1Click(TObject *Sender) { int i,j; bool ok; ok=true; i=0; j=1; while(ok) { if(ListBox1->Items->Strings[i]==ListBox1->Items->Strings[j]) { ListBox1->Items->Delete(i); j=i; } j++; if(j==ListBox1->Count) { if(++i==ListBox1->Count-1) ok=false; else j=i+1; } } }
J’espère qu’il n’existe pas dans les ListBox une propriété interdisant les doublets sinon cette méthode serait parfaitement inutile.
À bientôt
Gilles
Bonsoir,
Juste pour jouer, un brin de récursivité:
Vous remarquerez que la fin est honteusement pompée sur la méthode de Gilles Louise ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void __fastcall TForm6::Button8Click(TObject *Sender) { doublons(ListBox1, 0); } //--------------------------------------------------------------------------- void __fastcall TForm6::doublons(TListBox *aList, int idx) { int i = idx + 1; do { if (aList->Items->Strings[i] == aList->Items->Strings[idx]) { aList->Items->Delete(i); } else { i ++; } }while( i < aList->Items->Count); if (++idx != aList->Items->Count - 1) { doublons(aList, idx ++); } }
Mince, vais je devoir payer des droits d'auteur ?![]()
Il doit y avoir un problème quelque part car par exemple, si je remplis la TList de doublons comme suit, il y a un indice hors limites et ça bugue.
Alors que ma modeste contribution résiste à toutes les configurations.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for(i=0;i<20;i++) { ListBox1->AddItem("Bonjour"+IntToStr(i),ListBox1); ListBox1->AddItem("Bonjour"+IntToStr(i),ListBox1); }
À bientôt
Gilles
Bonsoir,
Effectivement, j'avais remplis le tableau des Items "manuellement" dans l'inspecteur d'objet, afin de faire un test rapidement et ca passait...
Dans le cas cité, il faudrait alors modifier le dernier "if" par
et a priori, ca passe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (idx ++ != aList->Items->Count - 1)
En revanche, si je refait un test maintenant avec une liste de valeur entrée manuellement dans la propriété Items de l'objet, ca ne marche pas ...
![]()
Partager