pyoo
Messages postés5Date d'inscriptionmardi 29 avril 2008StatutMembreDernière intervention30 avril 2008
-
29 avril 2008 à 14:03
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 2021
-
30 avril 2008 à 21:28
Bonjour à toutes et à tous,
J'ai un petit problème delphien!!
J'ai crée un fichier text dans lequel j'ai un certain nombre de ligne.
Je voudrais changer l'ordre des lignes pour qu'elles apparaissent dans un ordre aléatoire dans un autre fichier fichier texte.
dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 29 avril 2008 à 14:14
bonjour,
si cela est possible , importe ton fichier dans un TstringList.
tu en créé un deuxième vide qui sera ta destination.
tu prends un chiffre au hasard ente 0 et tstringListSource.count-1, tu l'ajoute dans ton tstringList de destination
tu effaces la ligne de ton tstringList source ...
Puis tu recommences.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 29 avril 2008 à 22:27
cantador t'es fatigué en ce moment ...
pourquoi utiliser des TTextFile alors qu'une TStringList suffit?!
{
melange les lignes d'un TString
parametres :
List [I/O] TStrings, liste a melanger
Pass [I] Integer, nombre de passe pour le melangeur. si -1
le melangeur utilise le nombre de lignes contenue
dans List.
}
procedure ListRandomizer(List: TStrings; const Pass: integer = -1);
var
N, L, P, R1, R2 : integer;
begin
RandSeed := GetTickCount;
L := List.Count;
if Pass = -1 then
P := L-1
else
P := Pass;
List.BeginUpdate;
try
for N := 0 to P do
begin
R1 := Random(L);
R2 := Random(L);
while R2 = R1 do
R2 := Random(L);
List.Exchange(R1, R2);
end;
finally
List.EndUpdate;
end;
end;
procedure FileListRandomizer(const Src, Dest : string);
var List : TStringList;
begin
List := TStringList.Create;
try
List.LoadFromFile(Src);
ListRandomizer(List);
List.SaveToFile(Dest);
finally
List.Free;
end;
end;
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 30 avril 2008 à 09:19
@foxi :
dis-donc foxi..
Petit détail, ma solution fonctionne alors que ton code plante sur
ListRandomizer(ListBox1);
car il y a incompatibilité entre TStrings et TListBox...
et autre remarque également RandSeed permet de générer d'une manière répétitive une série aléatoire alors que la question était de pouvoir faire un autre fichier mélangé de manière aléatoire ce qui n'est évidemment pas la même chose.
Comme quoi la fatigue peut gagner tout le monde même les meilleurs !
donc à ton clavier !
et ne dis plus que je suis vieux et crevé !
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 30 avril 2008 à 19:26
@Cantador
ListRandomizer(ListBox1.Items);
on aurait corriger :)
RandSeed := GetTickCount; <=== valeur qui change tout le temps même en cas d'oublis de Randomize.
@Pyoo
aprés des tests de perf, la methode de dom, Add/Delete est plus rapide (28 secondes pour 50 000 lignes) que Exchange (122 secondes pour 50 000 lignes).
bien sur y'a l'inconvegniant de perdre la liste d'origine ...
c'est le probleme avec les strings, soit on limite l'utilisation memoire et on a un code lents, soit on blinde la memoire et on a un code rapide.
la fameuse balance de l'extreme ... :)