Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Usar el TList->Sort() para colecciones

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Usar el TList->Sort() para colecciones Responder citando

Si estamos manejando una clase y la almacenamos en un TList como punteros a la clase y deseo ordenarla se debe usar Sort().
Sin embargo pide un parametro de tipo TListCompare.

¿Como puede definirlo para que me ordene por campos distintos de la clase?
En mi caso tengo en la clase dos enteros uno es id_tarea y otro orden_tarea. Y deseo aprovechar el quicksort del TList en vez
de programarlo.

Gracias por su atención
Carlos
carherv1@inf.upv.es

Volver arriba
Mensaje    Asunto: Usar el TList->Sort() para colecciones Responder citando

Hola Carlos:

Probablemente es mas facil de explicar de lo que yo lo voy a hacer Wink pero bueno, lo intentare con un pequeño ejemplo:

// Definimos una estructura como ejemplo
struct MiStruct {
    int campo1, campo2;
};

// Creamos la función que pasaremos luego como argumento a Sort(...)
// Tiene que devolver:
// un valor menor de 0: si Item1 < Item2
// un valor igual a 0: si Item1 == Item2
// y un valor mayor de 0: si Item1 > Item2
int __fastcall Comparar(void *Item1, void *Item2)
{
    MiStruct *datos1=(MiStruct*)Item1;
    MiStruct *datos2=(MiStruct*)Item2;

    if (datos1->campo1 < datos2->campo1)
        return -1;
    else if (datos1->campo1 > datos2->campo1)
        return 1;
    else
        return 0;
}
//-----------------------------------------------------------------
// He añadido el código para probarlo, al evento
// OnClick de un TButton
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // Rellenamos con algunos datos, en este caso
    // para facilitar el ejemplo no lo hacemos dinamicamente
    MiStruct datos[3] = { {5,10}, {1,20}, {3,30} };
    int i;
    String str;
    TList *MiList = new TList;

    // Añadimos los datos al TList
    for (i=0; i<3; i++)
        MiList->Add(&datos[i]);

    // Mostramos los datos antes de ser ordenados
    str = "ANTES de ordenar\n\n";
    for (i=0; i<MiList->Count; i++)
    {
        str += "campo1=";
        str += ((MiStruct*)MiList->Items[i])->campo1;
        str += " : campo2=";
        str += ((MiStruct*)MiList->Items[i])->campo2;
        str += "\n";
    }
    ShowMessage(str);

    // Ordenamos: le pasamos como argumento la
    // función que se encarga de hacer las comparaciones
    MiList->Sort(Comparar);

    // Mostramos los datos ordenados como prueba
    str = "DESPUES: ordenado por el campo1:\n\n";
    for (i=0; i<MiList->Count; i++)
    {
        str += "campo1=";
        str += ((MiStruct*)MiList->Items[i])->campo1;
        str += " : campo2=";
        str += ((MiStruct*)MiList->Items[i])->campo2;
        str += "\n";
    }
    ShowMessage(str);

    delete MiList;
}
//-----------------------------------------------------------------


Espero que sea lo que buscabas y que se haya entendido, sino dimelo.

Saludos.

Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.