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 ...
![]()
Mon algorithme avait aussi un petit problème, dans certains cas, on se retrouvait hors limites, pour plus de sécurité, il est préférable de décrémenter i si c'est possible après un delete. Et ça marche aussi avec une saisie manuelle.
À bientôt
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 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); if(i) i--; j=i+1; } if(++j==ListBox1->Count) { if(++i==ListBox1->Count-1) ok=false; else j=i+1; } } }
Gilles
Salut !
A plus !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 AnsiString N; for(int n = 0; n < ListBox1->Items->Count; n++) { N = ListBox1->Items->Strings[n]; for(int j = n+1; j < ListBox1->Items->Count; j++) { if(N == ListBox1->Items->Strings[j])ListBox1->Items->Delete(j); } }
Eh non, ça ne marche pas si j'initialise ainsi la ListBox
Je sais qu'en principe, ça ne peut pas arriver mais je préfère un algorithme universel comme le mien qui marche dans tous les cas, le dernier que j'ai donné, le précédent contenait une petite anomalie où dans certains cas le pointeur passait la limite et on se retrouvait hors indice acceptable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for(i=0;i<5;i++) { ListBox1->AddItem("Bonjour"+IntToStr(i),ListBox1); ListBox1->AddItem("Bonjour"+IntToStr(i),ListBox1); ListBox1->AddItem("Bonjour"+IntToStr(i),ListBox1); }
C'était bien essayé quand même.
À bientôt
Gilles
Bonjour,
Il y a aussi la possibilité de tester la présence d'un doublon lors de l'insertion des données dans la listbox
Cordialement,
Fabrice
Salut !
J'ai donc initialsé comme ceci :
Donc ça devient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 for(int i=0; i<5; i++) { ListBox1->Items->Add( "Bonjour"+IntToStr(i) ); ListBox1->Items->Add( "Bonjour"+IntToStr(i) ); ListBox1->Items->Add( "Bonjour"+IntToStr(i) ); }
En fait le problème était qu'après le delete, on sautait une ligne (on ne voyait donc jamais la 3e copie).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 AnsiString N; for(int n = 0; n < ListBox1->Items->Count; n++) { N = ListBox1->Items->Strings[n]; for(int j = n+1; j < ListBox1->Items->Count; j++) { while( (j < ListBox1->Items->Count) && (N == ListBox1->Items->Strings[j]) ) { ListBox1->Items->Delete(j); } } }
On compense donc avec un while pour lequel il faut faire attention puisque Count évolue "sans contrôle".
Donc il faut d'abord tester si l'index j est dans le ring et ensuite tester l'identité des chaînes !
Le seul problème est la gestion simultanée de la liste Objects..., sans doute à prévoir pour l'aspect "universel" !
A plus !
Excellent ! Je préfère le présenter comme suit pour ma part, je ne mets pas d'accolades s'il n'y a qu'une seule instruction (mais je n'ai pas forcément raison, d'aucuns préfèrent quand même les accolades).
À bientôt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int n,j; AnsiString N; for(n=0;n<ListBox1->Items->Count;n++) { N=ListBox1->Items->Strings[n]; for(j=n+1;j<ListBox1->Items->Count;j++) while((j<ListBox1->Items->Count) && (N==ListBox1->Items->Strings[j])) ListBox1->Items->Delete(j); }
Gilles
merci beaucoup![]()
Partager