TXT CLASSEMENT PAR ORDRE ALPHABÉTIQUE

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 28 sept. 2004 à 14:51
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010 - 31 mars 2006 à 18:21
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/26454-txt-classement-par-ordre-alphabetique

cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
31 mars 2006 à 18:21
merci à tous pour vos sources je viens de regarder :)
c pas mal du tout.
gaudetm Messages postés 44 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 13 décembre 2004
3 oct. 2004 à 11:06
moi perso, parfois pour ne pas me prendre la tete à trier, je fais un Parse de toute la phrase (avec delimiter l'espace) je les fous dans un object TListBox avec TListBox.Sort := True;
et puis je les recupère.

Biensure ma méthode n'est pas efficace pour un grand nombre de strings, mais elle reste le moyen le plus rapide au niveau du code à faire un tri.
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
29 sept. 2004 à 20:20
Delphiprog : encore merci pour ta fonction qui je dois l'avouer, me laisse bouche b, par sa rapiditée l'execution. Je l'ai deja mise dans mon programme. Cependant je garde quand même ma super fonction, et la place dans mon grenier, car je me suis bien pris la tête dessus. Un bon souvenir de mes debuts en delphi lol. Un grand MERCI à vous tous pour votre mobilisation et aussi pour avoir répondu aussi rapidement. @+ tard pour de nouvelles aventures :o)
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
29 sept. 2004 à 14:11
Florenth : par défaut, l'appel de la méthode Sort va trier les chaines en comparant sur toute leur longueur.
Or, ce que souhaitait obtenir askil2000, c'était une comparaison seulement sur les trois premiers caractères de chaque chaine. D'où l'obligation de réaliser une fonction de tri personnalisée (CustomSort en anglais).

Enfin, ce n'est pas possible de transtyper une TStrings en TStringList (une classe parente ne peut pas hériter d'une classe fille). En revanche, l'inverse est possible. Mais ce n'est pas utilisable ici.

Askil2000 : j'espère que tu sauras mettre en oeuvre cette tehnique dans tes applications. Elle est très puissante, simple à mettre et hautement réutilisable. Beaucoup de composants ont une propriété nommée Items, Strings ou Lines de type TStrings. Tu peux donc appeler cette procédure avec tous ces composants sans réécrire une seule linge de code.

Bonne prog' et que Delphi soit avec toi ! ;o)
Delphiprog : En effet ce serait dommage d'avoir trie tout cela pour rien :-(

Super pour ta fonction !!
Je n'aurais jamais pense a utiliser la methode customsort de la stringlist .

Par contre, si on assigne la chaine à trier avec Assign()
et qu l'on utilise Sort(), ne serai-ce pas plus rapide (pour ce traitement) que ta procedure ???

Sinon en effet, utiliser CustomSort() est bien plus efficace pour les autres operation que l'on pourrait faire avec les liste de chaines.

L'ennui comme tu dis, c'est de recopier deux fois la liste de chaines, il faudrait abolir TStrings au profit de TStringList.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
29 sept. 2004 à 13:29
En effet DelphiProg te donne ici une methode que je n' avais pas pensé.
Cependant, mon code fonctionne avec les arrays les bases de donées etc ...
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
29 sept. 2004 à 09:33
Oui, vu comme ça, c'est certain qu'on gagne un temp incroyable. Merci à vous pour cette magnifique demonstration.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 sept. 2004 à 20:17
Florenth : non, il ne faut pas libérer la mémoire à la sortie de ta fonction car, dans ce cas, cela revient à renvoyer un résultat égal à Nil.

Autre méthode, utilisant la possibilité de personnaliser les fonctions de tri d'une liste de chaines et infiniment plus rapide. Pour cela, j'emploie la méthode CustomSort d'un objet TStringList :

function MySortFunc(List: TStringList; Index1,
Index2: Integer): Integer;
var
S1, S2: string;
begin
S1 := Copy(List[Index1], 1, 3);
S2 := Copy(List[Index2], 1, 3);
if S1 > S2 then
Result := 1
else
if S1 < S2 then
Result := -1
else
Result := 0;
end;

procedure TFGestionArticles.Button1Click(Sender: TObject);
var
Sl: TStringList;
begin
Sl := TStringList.Create;
try
Sl.Assign(Memo1.Lines);
Sl.CustomSort(MySortFunc);
Memo1.Lines.Assign(Sl);
finally
Sl.Free;
end;

end;

Ceci a au moins deux avantages :
- déconnecter le tri de la gestion de l'interface
- pouvoir affecter une procédure de tri différente comme paramètre de la méthode CustomSort.

Inconvénient :
- deux opérations de copie des chaînes : une fois du composant Memo1 vers Sl et une deuxième de Sl vers Memo1.

Au niveau performances, ça reste honorable : 78 ms pour trier 1000 (mille) lignes...
Salut,
Tu peux aussi trier grâce a une stringlist :

function ClasserOrdreAlphabetique(Mots : TStrings): TStringlist;
var
i : integer;
begin
Result:=TStringList.Create;
Result.Sorted:=true;
for i:=0 to Mots.Count -1 do
Result.Add(Mots.Strings[i]);
end;

Voila.
Par contre, je ne sais pas s'il faut liberer la memoire allouée par le stringlist.

@+
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 sept. 2004 à 14:51
Voilà comment tu peux faire :

Var petit, i, j : Integer;
Str: String;
Begin

For i := 0 to Memo1.Lines.count -2 Do
Begin
// Rechercher l? element le plus petit :
petit := i; // par defaut
For j := i to Memo1.Lines.count ? 1 Do
Begin
If Memo1.Lines[j] < Memo1.Lines[petit]
// Ou alors pour les 3 premier caractere: If Copy(Memo1.Lines[j], 1, 3) < (Memo1.Lines[petit], 1, 3)
then petit := j;
End;

// Passer l? element le + petit en i :
Str := Memo1.Lines[i]; // Sauver ce qu? il y a en i ...
Memo1.Lines[i] := Memo1.Lines[petit];
Memo1.Lines[petit] := Str;
End;

End;

I existe je crois 4 façons de faire ça. (permutation, insertion etc ...)
Celle-ci en fait parti.
Rejoignez-nous