(je sais que c'est un an plus tard, mais toujours des choses utiles.)
suggestion Skamradt aux valeurs entières de pad suppose que vous allez trier en utilisant une comparaison de type chaîne. Ce serait lent. Appel de format() pour chaque insertion, plus lent encore. Au lieu de cela, vous voulez faire une comparaison entière.
Vous commencez avec un type d'enregistrement:
TExample = record
SortOrder : integer;
SomethingElse : string;
end;
Vous ne précisait pas comment les documents ont été stockés, ou comment vous vouliez y accéder une fois triés. Alors supposons que vous les mettez dans un tableau dynamique:
var MyDA Array of TExample;
...
SetLength(MyDA,NewSize); //allocate memory for the dynamic array
for i:=0 to NewSize-1 do begin //fill the array with records
MyDA[i].SortOrder := SomeInteger;
MyDA[i].SomethingElse := SomeString;
end;
Maintenant, vous voulez trier ce tableau par la valeur entière SortOrder. Si ce que vous voulez sortir est un TStringList (vous pouvez donc utiliser la méthode ts.Find) alors vous devez ajouter chaque chaîne à la liste et ajouter le SortOrder comme un pointeur. Puis trier sur le pointeur:
var tsExamples: TStringList; //declare it somewhere (global or local)
...
tsExamples := tStringList.create; //allocate it somewhere (and free it later!)
...
tsExamples.Clear; //now let's use it
tsExamples.sorted := False; //don't want to sort after every add
tsExamples.Capacity := High(MyDA)+1 //don't want to increase size with every add
//an empty dynamic array has High() = -1
for i:=0 to High(MyDA) do begin
tsExamples.AddObject(MyDA[i].SomethingElse,TObject(MyDA[i].SortOrder));
end;
Notez le tour de la coulée entier SortOrder en un pointeur TObject, qui est stocké dans la propriété TStringList.Object. (Cela dépend du fait que Integer et pointeur sont de la même taille.) Quelque part, nous devons définir une fonction pour comparer les pointeurs de TObject:
function CompareObjects(ts:tStringList; Item1,Item2: integer): Integer;
var i,j: integer;
begin
Result := integer(ts.Objects[i]) - integer(ts.Objects[j];
end;
Maintenant, nous pouvons trier les tsList sur .object en appelant .CustomSort place de .Sort (qui trierait sur la valeur de chaîne.)
tsExample.CustomSort(@CompareObjects); //Sort the list
le TStringList est triée par ordre, de sorte que vous pouvez itérer dessus de 0 à .Count-1 et lire les chaînes dans l'ordre.
Mais supposons que vous ne vouliez pas de TStringList, juste un tableau dans l'ordre trié. Ou les enregistrements contiennent plus de données que juste une chaîne dans cet exemple, et votre ordre de tri est plus complexe. Vous pouvez ignorer l'étape d'ajout de chaque chaîne et ajouter simplement l'index du tableau en tant qu'éléments dans un TList. Faites tout ce qui précède la même manière, à l'exception d'utiliser un TList au lieu de TStringList:
var Mlist: TList; //a list of Pointers
...
for i:=0 to High(MyDA) do
Mlist.add(Pointer(i)); //cast the array index as a Pointer
Mlist.Sort(@CompareRecords); //using the compare function below
function CompareRecords(Item1, Item2: Integer): Integer;
var i,j: integer;
begin
i := integer(item1); //recover the index into MyDA
j := integer(item2); // and use it to access any field
Result := SomeFunctionOf(MyDA[i].SomeField) - SomeFunctionOf(MyDA[j].SomeField);
end;
Maintenant que Activer ListeM est triée, l'utiliser comme une table de recherche pour accéder au tableau dans l'ordre de tri:
for i:=0 to Mlist.Count-1 do begin
Something := MyDA[integer(Mlist[i])].SomeField;
end;
Comme je itère sur le TList, nous récupérons les index de tableau dans l'ordre trié. Nous avons juste besoin de les renvoyer aux entiers, puisque le TList pense qu'ils sont des pointeurs. J'aime faire cela de cette façon, mais vous pouvez aussi mettre de vrais pointeurs sur les éléments du tableau dans TList en ajoutant l'adresse de l'élément tableau au lieu de son index. Ensuite, pour les utiliser, vous les transformerez en pointeurs vers des enregistrements TExample. C'est ce que Barry Kelly et CoolMagic ont dit de faire dans leurs réponses.
Nous sommes allés dans cet exercice et trouvé la meilleure façon est d'écrire mon propre code. Je ne pense pas que l'une des réponses devrait être recommandée comme ** meilleure **. – Sam
Point pris. Peut-être pourriez-vous ajouter une réponse avec votre solution au problème? – Marius
Il existe de bonnes informations dans Tomes of Delphi Algorithms and Data Structures de Julian Bucknall. (s –