Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2021
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Ordenar TStringList con objetos

Tengo un TStringList que cargo a partir de elementos seleccionados en un TListView así:
Código:
for (nItem = 0; nItem < ListView1->Items->Count; nItem ++)
{
     if (!ListView1->Items->Item[nItem]->Checked)
          continue;

     cAux = "";
     if (InputQuery(Application->Title, UpperCase(ComboBox1->Items->Strings[ComboBox1->ItemIndex]) + "\n" + ListView1->Items->Item[nItem]->Caption + "\nIndique la cantidad", cAux) && StrToIntDef(cAux, 0) > 0)
          slDatos->AddObject(ListView1->Items->Item[nItem]->Caption, (TObject *)StrToInt(cAux));
}
Supongamos que una vez cargado el TStringList quedara así:
Cita:
Dato 1 - 100
Dato 2 - 200
Dato 3 - 300
Dato 4 - 400
Dato 5 - 500
y necesito ordenar la lista descendentemente para que queda así:
Cita:
Dato 5 - 500
Dato 4 - 400
Dato 3 - 300
Dato 2 - 200
Dato 1 - 100
Para ordenarla estoy usando esto:
Código:
for (int nUno = 1; nUno < slDatos->Count; ++ nUno)
     for (int nDos = 0; nDos < slDatos->Count - nUno; nDos ++)
          if ((int)(TObject*)slDatos->Objects[nDos] < (int)(TObject*)slDatos->Objects[nDos + 1])
          {
               Objeto = new TObject();
               Objeto = slDatos->Objects[nDos];
               slDatos->Objects[nDos]     = slDatos->Objects[nDos + 1];
               slDatos->Objects[nDos + 1] = Objeto;
          }
Evidentemente Objeto está declarado como TObject *Objeto. Pero cuando termina me ha ordenado bien las cantidades pero no los literales y queda así:
Cita:
Dato 1 - 500
Dato 2 - 400
Dato 3 - 300
Dato 3 - 200
Dato 5 - 100
¿Qué estoy haciendo mal?
Responder Con Cita
  #2  
Antiguo 04-03-2021
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Creo que te resultará mas sencillo usar el método CustomSort de la clase TStringList, ejemplo:

Código PHP:
int __fastcall SortCompareTStringListTSint i1int i2 )
{
   return 
TS->Strings[i2].AnsiCompare(TS->Strings[i1]);
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
  
TStringList *TS = new TStringList;

  
TS->Clear();
  
TS->AddObject("dato1",(TObject*)100);
  
TS->AddObject("dato2",(TObject*)200);
  
TS->AddObject("dato3",(TObject*)300);
  
TS->AddObject("dato4",(TObject*)400);
  
TS->AddObject("dato5",(TObject*)500);

  
// ordenar
  
TS->CustomSort(SortCompare);

  
// mostrar
  
for(int i 0TS->Counti++)
    
Memo1->Lines->Add(TS->Strings[i] + " - " +
       (int)(
TS->Objects[i]));

  
delete TS;

Salida:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 05-03-2021 a las 00:02:23.
Responder Con Cita
  #3  
Antiguo 05-03-2021
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
No conocía el método. Muchas gracias. No obstante no lo veo claro: Haces una llamada a una función SortCompare pero ¿no pasas parámetros en la misma? ¿No falta nada en esa llamada? Además, tal como has puesto el código, yo entiendo que se comparan únicamente dos elementos (i1 e i2).

Última edición por Angel.Matilla fecha: 05-03-2021 a las 10:48:15.
Responder Con Cita
  #4  
Antiguo 05-03-2021
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

El método CustomSort ordena el TStringList mediante una función de comparación personalizada cuyo puntero recibe como argumento.
Esta, deberá comparar dos elementos de la lista y devolver un número que será:
  • Negativo si el primer elemento es menor que el segundo.
  • Cero si ambos elementos sin iguales.
  • Positivo si el primer elemento es mayor que el segundo.
En el ejemplo, el método CustomSort asume this como el parámetro TS, mientras que 0 y TS->Count como los sucesivos índices de la lista.

Para ordenar de forma ascendente dispones del método Sort de forma directa, pero también puedes usar CustomSort del siguiente modo:
Código PHP:
int __fastcall SortCompareTStringListTSint i1int i2 )
{
   return 
TS->Strings[i1].AnsiCompare(TS->Strings[i2]); 
Prueba el ejemplo para verificar.


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 05-03-2021 a las 15:56:30.
Responder Con Cita
  #5  
Antiguo 06-03-2021
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Perfecto. Cuando lo probé ayer, antes de escribir el mensaje, me estaba dando un error de compilación y era porque había declarado mal esa función SortCompare. Muchísimas gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ordenar objetos de mas grandes a mas pequeños en TListView Reasen Varios 3 17-11-2016 17:51:52
Ordenar TStringList eennzzoo C++ Builder 2 29-06-2014 00:51:53
ordenar descendente TStringList Sort ingabraham Varios 3 28-03-2014 15:25:31
Duda sobre destrucción de objetos compuestos por otros objetos noob OOP 11 16-02-2009 00:28:33
Agregar objetos a TstringList patorecalde Varios 7 02-11-2006 19:32:31


La franja horaria es GMT +2. Ahora son las 07:08:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi