SOURCE SUPPRIMÉE SOURCE SUPPRIMÉE À LA DEMANDE DE L'AUTEUR.

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 31 déc. 2004 à 10:52
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Derniè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.

https://codes-sources.commentcamarche.net/source/28521-source-supprimee-source-supprimee-a-la-demande-de-l-auteur

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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és 26 Date d'inscription mardi 2 juillet 2002 Statut Membre Dernière intervention 20 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és 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 déc. 2004 à 11:37
Exact jmp77 :
MyStringList.AddStrings(Listbox3.items);

est plus "propre".

Je vois que tu as rencontré les mêmes problèmes que moi.
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
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);

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.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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');

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.
Rejoignez-nous