Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-03-2010
bothy bothy is offline
Miembro
 
Registrado: ene 2010
Posts: 144
Poder: 15
bothy Va por buen camino
metodo de ordenacion

Quisiera saber si delphi 2009 tiene alguna funcion o propiedad asi como sort para ordenar los numeros que balla introduciendo en un listbox .

si en la propiedad sorted del litsbox la activo y me ordena alfabeicamente y yo lo que quisiera saber como le hago para que ordene numericamente.
Responder Con Cita
  #2  
Antiguo 09-03-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Que yo sepa no hay un método así para los TStrings (los items de los TListBox son del tipo TStrings).
Lo único que te puedo recomendar es este procedimiento que acabo de hacer para tu pregunta:
Código Delphi [-]
procedure OrdenNumerico(var L:TListBox; Menor_A_Mayor:boolean = True);
{Si Menor_A_Mayor es TRUE, se guardan de menor a mayor}
{Si es FALSE, se guardan de mayor a menor}
var
  I,J,NumI,NumJ,Indice:Integer;
  Temp:String;
begin
  for I := 0 to L.Count - 1 do begin
    Indice:=I;
    for J := I+1 to L.Count - 1 do begin
      NumI:=StrToInt(L.Items.Strings[Indice]);
      NumJ:=StrToINt(L.Items.Strings[J]);
      case Menor_A_Mayor of
        TRUE:
          begin
            if (NumJ < NumI) then
              Indice:=J;
          end;
        FALSE:
          begin
            if (NumJ > NumI) then
              Indice:=J;
          end;
      end; //End CASE
    end; //End FOR J
    Temp:=L.Items.Strings[i];
    L.Items.Strings[i]:=L.Items.Strings[Indice];
    L.Items.Strings[Indice]:=Temp;
  end; //End FOR I
end;
Solamente ordena números. Si tu TListBox contiene palabras, va a tirar error.
Le mandás como primer argumento el TListBox que quieras ordenar (ListBox1, ListaNumeros, como se llame) y como segundo argumento le mandás TRUE si querés que los ordene de menor a mayor (ascendente) o FALSE si querés que los ordene de mayor a menor (descendente).
Saludos!

Última edición por BrunoBsso fecha: 09-03-2010 a las 09:06:21. Razón: Se creaba mal el código en la página
Responder Con Cita
  #3  
Antiguo 09-03-2010
bothy bothy is offline
Miembro
 
Registrado: ene 2010
Posts: 144
Poder: 15
bothy Va por buen camino
gracias colega un poco dificil para mi que son principiante todabia pero si logro entenderle . .
buscaba algo mas facil asi como el metodo de la burbuja ...
Responder Con Cita
  #4  
Antiguo 09-03-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por bothy Ver Mensaje
...tiene alguna funcion o propiedad asi como sort para ordenar los numeros que balla introduciendo en un listbox .
si en la propiedad sorted del litsbox la activo y me ordena alfabeicamente y yo lo que quisiera saber como le hago para que ordene numericamente.

Si son pocos números y el tema de velocidad no es muy importante, a veces he utilizado un TStringList a modo de intermediario.

(0) Desactivar el orden del ListBox.
(1) Copias todos los números al TSttingList pero formateandolos como cadenas con ceros a la izquierda; 00001, 00023, 00167,...
(2) Mandas ordenar ese StringList, que en este caso los ordena como cadenas, pero con la ordenación numérica correcta.
(3) Un for que los vuelve a copiar al ListBox convirtiéndolos a números.

Ya se no, es nada "sofisticado" pero para 1000, 5000,... números es inmediato.

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  TS:TStringList;
  str:string;
  i, j:Integer;
begin
  TS := TStringList.Create();
  try
    // Recorrer la lista y almacenarlo en la Lista intermedia    
    for i := 0 to (ListBox1.Items.Count - 1) do begin
      Str := DupeString('0', 10) + ListBox1.Items[i];
      Str := Copy(Str, Length(Str) - 10, Length(Str));
      TS.Add(Str)
    end;

    //ordenar
    TS.Sorted := True;

    // Limpiar la original
    ListBox1.Items.Clear;

    // Volver a pasarlos a la original
    for i := 0 to (TS.Count - 1) do begin
      j := StrToInt(TS[i]);
      ListBox1.Items.Add(IntToStr(j));
    end;

  finally
    FreeAndNil(TS);
  end;
end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 09-03-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Question

Cita:
Empezado por bothy Ver Mensaje
gracias colega un poco dificil para mi que son principiante todabia pero si logro entenderle . .
buscaba algo mas facil asi como el metodo de la burbuja ...
No te hice el Bubble Sort porque para una lista con cientos de miles de números tardaría mucho y come muchos recursos (es recursivo).
Tampoco hice lo que explicó Neftali porque no quise confundirte con los TStringList que son otro tipo de datos, como los TStrings, pero mejores (opinión mía).
El método que te expliqué se llama de intercambio y es el más simple.
Además, Neftali, no entiendo por que esto:
Código Delphi [-]
for i := 0 to (TS.Count - 1) do begin
  j := StrToInt(TS[i]);
  ListBox1.Items.Add(IntToStr(j));
end;
Primero, no sabía que se podía ubicar un string en una lista así (TS[i]), pensé que se podía solamente con TS.Strings[i].
Segundo, para que almacenar ese string en un integer, para después copiarlo como string de nuevo. Es un paso en vano.
¿No sería mejor ListBox1.Items.Add(TS.Strings[i])?
Saludos!!
Responder Con Cita
  #6  
Antiguo 09-03-2010
bothy bothy is offline
Miembro
 
Registrado: ene 2010
Posts: 144
Poder: 15
bothy Va por buen camino
Se me hace mas entendible el metodo de intercambio de BrunoBsso
ya que el otro se me iso muy complicado.. ya que soy novato en delphi pero si les entiendo a alos metodos que pusieron gracias amigos..
Responder Con Cita
  #7  
Antiguo 10-03-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por bothy Ver Mensaje
Se me hace mas entendible el metodo de intercambio de BrunoBsso ya que el otro se me iso muy complicado.. ya que soy novato en delphi pero si les entiendo a alos metodos que pusieron gracias amigos..
Intenta comprederlos los dos y utiliza el que tú creas conveniente.
Mejor 2 que 1 ¿no?

Si tienes algunas duda pregunta sin problemas.



Cita:
Empezado por BrunoBsso Ver Mensaje
Primero, no sabía que se podía ubicar un string en una lista así (TS[i])
En este caso puedes usar el que prefieras, son equivalentes.

Cita:
Empezado por BrunoBsso Ver Mensaje
Segundo, para que almacenar ese string en un integer, para después copiarlo como string de nuevo. Es un paso en vano.
¿No sería mejor ListBox1.Items.Add(TS.Strings[i])?
Cierto, era por una cuestión de claridad y que le fuera más sencillo de entender.

Como bien dices esto:
Código Delphi [-]
    for i := 0 to (TS.Count - 1) do begin
      j := StrToInt(TS[i]);
      ListBox1.Items.Add(IntToStr(j));
    end;

es equivalente a esto:

Código Delphi [-]
    for i := 0 to (TS.Count - 1) do begin
      ListBox1.Items.Add(TS.Strings[i]);
    end;

Aunque en realidad lo más simple y lo que yo hubiera hecho, hubiera sido esto (sin usar for):

Código Delphi [-]
  ListBox1.Items.AddStrings(TS);

Pero me pareció más simple. Tal vez al final lié la cosa...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 10-03-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Mirá vos, después de tanto manejar TStringList me vengo a enterar recién que se pueden ubicar con T[i].
Siempre se aprende algo nuevo, ¿no?
Mucho mejor, más rápido que escribir T.Strings[i]
Saludos y gracias por el tip!!!!
Responder Con Cita
  #9  
Antiguo 10-03-2010
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por BrunoBsso Ver Mensaje
No te hice el Bubble Sort porque para una lista con cientos de miles de números tardaría mucho y come muchos recursos (es recursivo).
Sólo una corrección si me lo permites,
BubbleSort no es recursivo, es iterativo. Es uno de los algoritmos más estable y se basa en el método por intercambio.

El que es recursivo, e intuyo que es al que te refieres, es QuikSort (uno de los inestables), el cual si bien tiene la ventaja de tener una complejidad computacional menor (en términos promedios, en el peor caso iguala al Burbuja y otros) que el Burbuja tiene la contra de requerir más uso de memoria (aunque hay que reconocer que no es además muy exagerada... del orden O(log n)) y su método es de partición.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 10-03-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Tenés razón, me los confundí entre los 2.
Hace tanto que no uso ninguno que ya ni me acuerdo como se llaman jajaja.
Gracias por la corrección!
Responder Con Cita
  #11  
Antiguo 10-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Neftali Ver Mensaje
(0) Desactivar el orden del ListBox.
(1) Copias todos los números al TSttingList pero formateandolos como cadenas con ceros a la izquierda; 00001, 00023, 00167,...
(2) Mandas ordenar ese StringList, que en este caso los ordena como cadenas, pero con la ordenación numérica correcta.
(3) Un for que los vuelve a copiar al ListBox convirtiéndolos a números.
Neftali, puedes ahorrar unos pasos si usas el método CustomSort de TStringList. A este método le pasas como parámetro una función que compara dos valores. De esta manera te evitas el rellenar con ceros.

// Saludos
Responder Con Cita
  #12  
Antiguo 11-03-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Thumbs up

Cita:
Empezado por roman Ver Mensaje
Neftali, puedes ahorrar unos pasos si usas el método CustomSort de TStringList. A este método le pasas como parámetro una función que compara dos valores. De esta manera te evitas el rellenar con ceros.
Cierto Román.
Y ese sería aun mejor que el comentado antes.
La verdad es que es de esas cosas que sabes que están ahí, pero que nunca usas. Es mi caso, no lo he usado nunca y en este caso simplificaría las cosas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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
ordenación DBGRId cmm07 Varios 5 14-04-2009 03:14:44
ordenacion Quicksort Samurai JAVA 1 04-06-2007 23:12:21
ordenacion de un array mediante el metodo de la burbuja baby Varios 11 08-05-2007 02:43:55
ordenacion arrays halizia PHP 7 07-02-2007 10:47:03
DbGrid Con Ordenación Rabata Varios 2 14-05-2005 15:26:28


La franja horaria es GMT +2. Ahora son las 02:26:28.


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