(sé que esto es un año más tarde, pero todavía cosas útiles.)
sugerencia de Skamradt a valores enteros almohadilla asume que se va a ordenar mediante una cadena de comparar. Esto sería lento. Formato de llamada() para cada inserción, aún más lento. En cambio, quieres hacer una comparación de enteros.
Se empieza con un tipo de registro:
TExample = record
SortOrder : integer;
SomethingElse : string;
end;
Usted no indicó cómo se almacenan los registros, o cómo quería acceder a ellos una vez ordenados. Así que vamos a suponer que los pone en una matriz dinámica:
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;
Ahora que desea ordenar esta matriz por el valor entero SortOrder. Si lo que desea es un TStringList (para que pueda usar el método ts.Find), debe agregar cada cadena a la lista y agregar SortOrder como un puntero. A continuación, ordenar en el puntero:
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;
Nota el truco de echar la Entero SortOrder en un puntero TObject, que se almacena en la propiedad TStringList.Object. (Esto depende del hecho de que enteros y Pointer son del mismo tamaño.) En algún lugar hay que definir una función para comparar los punteros: TObject
function CompareObjects(ts:tStringList; Item1,Item2: integer): Integer;
var i,j: integer;
begin
Result := integer(ts.Objects[i]) - integer(ts.Objects[j];
end;
Ahora, podemos clasificar la tsList en .Object llamando .CustomSort vez de .Sort (que clasificar en el valor de cadena.)
tsExample.CustomSort(@CompareObjects); //Sort the list
el TStringList se ordenan ahora, por lo que puede iterar sobre ella de 0 a .Count-1 y leer las cadenas en el orden establecido.
Pero supongamos que no desea una TStringList, solo una matriz ordenada. O los registros contienen más datos que solo una cadena en este ejemplo, y su orden de clasificación es más complejo. Puede omitir el paso de agregar cada cadena y simplemente agregar el índice de matriz como Elementos en un TList. Hacer todo por encima de la misma manera, excepto utilizar un TList en lugar 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;
Ahora que ListaM está ordenada, lo utilizan como una tabla de búsqueda para acceder a la matriz en forma ordenada:
for i:=0 to Mlist.Count-1 do begin
Something := MyDA[integer(Mlist[i])].SomeField;
end;
Como itera sobre el TList, recuperamos los índices de matriz en orden ordenado. Solo tenemos que volver a convertirlos en números enteros, ya que TList cree que son punteros.
Me gusta hacerlo de esta manera, pero también podría poner punteros reales a los elementos de la matriz en TList al agregar la Dirección del elemento de la matriz en lugar de su índice. Luego, para usarlos, los lanzará como punteros a los registros de TExample. Esto es lo que Barry Kelly y CoolMagic dijeron que hicieran en sus respuestas.
acaba de pasar por este ejercicio y encontrado la mejor manera es escribir mi propio código. No creo que ninguna de las respuestas deba recomendarse como ** mejor **. – Sam
Punto tomado. ¿Tal vez podría agregar una respuesta con su solución al problema también? – Marius
Hay buena información en Tomes of Delphi Algorithms and Data Structures por Julian Bucknall. (s –