SOURCE SUPPRIMÉE SOURCE SUPPRIMÉE À LA DEMANDE DE L'AUTEUR.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
31 déc. 2004 à 10:52
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 2021
-
3 juin 2007 à 15:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 3 juin 2007 à 15:05
Il est surprenant de noter que la propriété TStringList.Duplicates = dupIgnore par défaut, ce qui fait qu'on peut négliger l'instruction en rapport.
C'est pourtant la valeur attribuée à cette propriété qui explique le fonctionnement du code.
Je note avec jubilation la date de cet intéressant échange entre Delphiprog et jmp77.
cs_Theos
Messages postés26Date d'inscriptionmardi 2 juillet 2002StatutMembreDernière intervention20 décembre 2009 31 déc. 2004 à 18:49
Delphiprog, OrdreAlphabet fonctionne très bien car Alphabet.sort=true !
La fonction ne renvoi pas toujours vrai !
Cette fonction permet de comparer l'ordre de 2 mots dans l'alphabet... J'aurais pu en refaire intégralement une mais j'ai trouvé tellement plus simple d'exploiter les fonctions déja implémentés des listbox...
Je ne connais pas QuickSort, merci pour l'info, je vais me renseigner...
Ta procedure btnCopyWithoutDuplicatesClick marche super. Elle est parfois beaucoup plus rapide que la mienne ;-) Merci bien ;-)
Je savais pas que les TStringList possèdaient sl.Duplicates := dupIgnore;
Je me suis fais beaucoup chié pour rien en fait ;-)
Pour ce qui est des plantages, il faut etre patient...La liste générée est assez volumineuse. Essayez de réduire le nombre d'éléments...(j'avais mis 10 000 dans Button3Click).
Sur mon P4 2.8Ghz le cycle complet prend parfois 1 ou 2 minutes donc c'est assez long...
En conclusion :
La procedure de DelphiProg semble être plus rapide que EstDansLaListeParDichotomie pour faire des copies sans doublons... Merci l'ami pour le tuyau ;-)
J'aime pas trop dire que ma fonction EstDansLaListeParDichotomie sert à rien donc je vais terminer en disant qu'elle peut etre, très simplement, adaptée pour retrouver l'Id d'un élément déja présent dans la liste...
Après ça, il faudrait tester pour savoir si c'est plus rapide que les truc du genre listbox2.items.IndexOf('DKLE')...
A+
Theos
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201333 31 déc. 2004 à 11:37
Je vois que tu as rencontré les mêmes problèmes que moi.
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 31 déc. 2004 à 11:10
Hello,
Alors meme remarque que delphiprog :
-Pas de composants nommé.
-Et j'ai du aussi interrompre le programme a chaque fois que je l'ai lancé.
Voici le code que j'ai mis qui est a peu pres le meme que delphiprog il est toujours plus rapide que moi (lol).
J'ai rajouter un listBox et un TButton (ListBox4 et Button5 pour les nommer comme toi).
procedure TForm1.Button5Click(Sender: TObject);
Je pense que tu peux tester cela et mettre à jour ta source.
Bonne prog,
JMP77.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201333 31 déc. 2004 à 10:52
Une fois de plus il faut faire remarquer que les composants utilisés dans le code ne sont pas nommés.
Ca devient lasssant.
Ainsi button3 correspond à l'étape 1, Button1 à l'étape 2, etc.
Quel est vraiment le rôle d ela fonction OrdreAlphabet :
Alphabet.clear;
Alphabet.items.add(a);
Alphabet.items.add(b);
if Alphabet.items.strings[0] = a then
begin
OrdreAlphabet := true;
end
else
begin
OrdreAlphabet := false;
end;
end;
Dans la mesure où tu vides la liste avec Clear, le paramètre a est toujours en position d'indice 0 puisque ajouté en premier. Donc le test qui suit renvoie toujours vrai.
En ce qui me concerne, j'ai dû mettre fin à l'exécution du programme après avoir cliqué sur Button2 au bout de quelques minutes (CTRL F2).
En ce qui concerne la définition que tu donnes de la recherche dichotomique, je ne suis pas sur qu'elle soit vraiment exacte.
Si tu veux améliorer grandement la vitesse d'exécution, jettes un oeil sur les algorithmes de tri tels que QuickSort.
Voici une proposition qui n'ajoute que les éléments de la liste qui ne sont pas des doublons. Je n'ai pas mesuré le temps d'exécution tellement il est insignifiant sur 10000 éléments :
procedure TForm1.btnCopyWithoutDuplicatesClick(Sender: TObject);
var
sl: TStringList;
i: integer;
begin
memo1.lines.Add('Début : ' + timetostr(time));
sl := TStringList.Create;
try
//Ignore les doublons
sl.Duplicates := dupIgnore;
//IMPORTANT : ssi la liste est triée
sl.Sorted := True;
//copie des chaines de ListBox3
for i := 0 to ListBox3.Items.Count - 1 do
sl.Append(ListBox3.Items[i]);
//Copie de la liste épurée dans listbox2
ListBox2.Clear;
ListBox2.Items.AddStrings(Sl);
Memo1.Lines.Append(IntToStr(sl.Count) + ' lignes sans doublons');
3 juin 2007 à 15:05
C'est pourtant la valeur attribuée à cette propriété qui explique le fonctionnement du code.
Je note avec jubilation la date de cet intéressant échange entre Delphiprog et jmp77.
31 déc. 2004 à 18:49
La fonction ne renvoi pas toujours vrai !
Cette fonction permet de comparer l'ordre de 2 mots dans l'alphabet... J'aurais pu en refaire intégralement une mais j'ai trouvé tellement plus simple d'exploiter les fonctions déja implémentés des listbox...
Je ne connais pas QuickSort, merci pour l'info, je vais me renseigner...
Ta procedure btnCopyWithoutDuplicatesClick marche super. Elle est parfois beaucoup plus rapide que la mienne ;-) Merci bien ;-)
Je savais pas que les TStringList possèdaient sl.Duplicates := dupIgnore;
Je me suis fais beaucoup chié pour rien en fait ;-)
Pour ce qui est des plantages, il faut etre patient...La liste générée est assez volumineuse. Essayez de réduire le nombre d'éléments...(j'avais mis 10 000 dans Button3Click).
Sur mon P4 2.8Ghz le cycle complet prend parfois 1 ou 2 minutes donc c'est assez long...
En conclusion :
La procedure de DelphiProg semble être plus rapide que EstDansLaListeParDichotomie pour faire des copies sans doublons... Merci l'ami pour le tuyau ;-)
J'aime pas trop dire que ma fonction EstDansLaListeParDichotomie sert à rien donc je vais terminer en disant qu'elle peut etre, très simplement, adaptée pour retrouver l'Id d'un élément déja présent dans la liste...
Après ça, il faudrait tester pour savoir si c'est plus rapide que les truc du genre listbox2.items.IndexOf('DKLE')...
A+
Theos
31 déc. 2004 à 11:37
MyStringList.AddStrings(Listbox3.items);
est plus "propre".
Je vois que tu as rencontré les mêmes problèmes que moi.
31 déc. 2004 à 11:10
Alors meme remarque que delphiprog :
-Pas de composants nommé.
-Et j'ai du aussi interrompre le programme a chaque fois que je l'ai lancé.
Voici le code que j'ai mis qui est a peu pres le meme que delphiprog il est toujours plus rapide que moi (lol).
J'ai rajouter un listBox et un TButton (ListBox4 et Button5 pour les nommer comme toi).
procedure TForm1.Button5Click(Sender: TObject);
var
MyStringList : TStringList;
begin
MyStringList := TStringList.Create;
Try
MyStringList.Sorted := True; //Triage par ordre alphabétique
MyStringList.Duplicates := dupIgnore; //Enleve les doublons
MyStringList.AddStrings(Listbox3.items);
ListBox4.Items := MyStringList;
Finally
MyStringList.Free;
end;
end;
PS : Le temps de trie est dérisoire.
Je pense que tu peux tester cela et mettre à jour ta source.
Bonne prog,
JMP77.
31 déc. 2004 à 10:52
Ca devient lasssant.
Ainsi button3 correspond à l'étape 1, Button1 à l'étape 2, etc.
Quel est vraiment le rôle d ela fonction OrdreAlphabet :
Alphabet.clear;
Alphabet.items.add(a);
Alphabet.items.add(b);
if Alphabet.items.strings[0] = a then
begin
OrdreAlphabet := true;
end
else
begin
OrdreAlphabet := false;
end;
end;
Dans la mesure où tu vides la liste avec Clear, le paramètre a est toujours en position d'indice 0 puisque ajouté en premier. Donc le test qui suit renvoie toujours vrai.
En ce qui me concerne, j'ai dû mettre fin à l'exécution du programme après avoir cliqué sur Button2 au bout de quelques minutes (CTRL F2).
En ce qui concerne la définition que tu donnes de la recherche dichotomique, je ne suis pas sur qu'elle soit vraiment exacte.
Si tu veux améliorer grandement la vitesse d'exécution, jettes un oeil sur les algorithmes de tri tels que QuickSort.
Voici une proposition qui n'ajoute que les éléments de la liste qui ne sont pas des doublons. Je n'ai pas mesuré le temps d'exécution tellement il est insignifiant sur 10000 éléments :
procedure TForm1.btnCopyWithoutDuplicatesClick(Sender: TObject);
var
sl: TStringList;
i: integer;
begin
memo1.lines.Add('Début : ' + timetostr(time));
sl := TStringList.Create;
try
//Ignore les doublons
sl.Duplicates := dupIgnore;
//IMPORTANT : ssi la liste est triée
sl.Sorted := True;
//copie des chaines de ListBox3
for i := 0 to ListBox3.Items.Count - 1 do
sl.Append(ListBox3.Items[i]);
//Copie de la liste épurée dans listbox2
ListBox2.Clear;
ListBox2.Items.AddStrings(Sl);
Memo1.Lines.Append(IntToStr(sl.Count) + ' lignes sans doublons');
finally
sl.Free;
memo1.lines.Add('Fin : ' + timetostr(time));
end;
end;
Pour que tu puisses t'y retrouver, je n'ai pas renommé tes composants.