![]() |
Ordenar un array de records
Tengo un array de records, donde luego cada record tiene una serie de campos. Necesito ordenar el array según uno de los campos, y mi pregunta es si existe alguna función en Delphi que lo haga automáticamente. Si no es así, ya sé que tendré que implementar un algoritmo de ordenación (la burbuja, quick sort, etc), pero si ya hay función que lo haga, pues me lo ahorro.
Por si no me he explicado bien, mi array sería del tipo: Y necesitaría luego ordenar el array "Lista" según el campo "Fecha". La cosa es bastante más compleja, pero lo he simplificado mucho para que sea más fácil de entender lo que pregunto ;) |
No recuerdo que haya nada para este efecto. Sin embargo podrías considerar usar un TList en lugar de un arreglo ya que esta clase sí tiene incorporado un método de ordenación al cual únicamente tienes que pasarle una función de comparación que dictamine cuando un elemento es menor que otro. El algoritmo que usa es el QuickSort.
// Saludos |
Pues yo propongo un TobjectList de esta forma quedaría algo así:
Básicamente es lo mismo que propone Roman, pero te ahorras el uso de punteros, siempre trabajas con objetos. Ganas claridad conceptual y de código. Saludos |
Gracias por la idea a los dos ;)
Lepe, intento hacer lo que me has comentado, pero no entiendo muy bien cómo va la definición de Objetos y variables que haces. Si fueras tan amable de explicar un poco en qué consiste.... y cómo se trabaja luego con el TobjectList, que el tema se me escapa un poco. |
A ver si queda más claro.
Para recorrer la lista de objetos: Si te fijas, cada vez que accedo a la propiedad Lista.items, tengo que hacer un casteo, es decir, la Lista no sabe que tipo de objeto tiene dentro, se lo dices mediante el cast .... Tcliente(lista.items[i]) Para ordenar la lista, tienes que hacer una funcion simple de comparación de 2 Objetos.
Y para ordenar usarías la orden: Esto es algo rarito, se le da la direccion de memoria donde está la funcion de ordenación; a partir de aquí, la lista ya sabe como comparar 2 objetos, y ordena la lista entera Si quieres ordenar por Nombre, Create una funcion OrdenaPorNombre que haga la comparación, y devuelva -1, 1 o cero. Si en algun momento quieres quitar un cliente, puedes hacerlo así:
Espero te ayude. Saludos |
Todo esto está muy bien pero si ya va a usar objetos para mi que los registros salen sobrando. Es decir, en lugar de
¿por qué no simplemente
// Saludos |
Muchas gracias a los 2, lo he implementado utilizando el TObjectlist, y va perfectamente (por cierto, lo que comenta Roman también se me había pasado a mí por la cabeza al ver la respuesta de Lepe ;) ).
Lo único que no entiendo muy bien es la función de ordenación que ha puesto Lepe: ¿No debería ser así?:
Teniendo en cuenta que la definición de TCliente es la que ha sugerido Roman, es decir:
|
jejeje, estan al quite ;)
El final de mi mensaje incluía esa opción, pero lo quité por 2 razones: - Si ya lo tienes todo implementado con Records, tienes menos modificaciones. - Si ya guardas el archivo con un File of Trecord, puedes seguir usandolo con los objetos, sin tener que modificar nada. Si haces la corrección que propone Roman, debes cambiar la función de ordenación como bien has sugerido, Feñiz. Saludos |
La franja horaria es GMT +2. Ahora son las 21:29:29. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi