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 .
Version imprimable
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:
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:
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 ... :mouarf:Code:
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 ? :aie:
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:
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:
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 ...
:koi:
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ôtCode:
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:
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:
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:
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:
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ôtCode:
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:P