PDA

Ver la Versión Completa : Máximo o mínimo valor en un listbox


CarlosAlberto
01-12-2011, 12:52:13
Estimados miembros del club: ¿cómo puedo obtener el máximo o el mínimo valor de una serie de datos colocados en un "Listbox"?
Gracias y saludos cordiales.
Carlos Alberto

fjcg02
01-12-2011, 12:54:50
Se me ocurre que crees un TStringList, copies los elementos, ordenes y cojas el primero y el último.


Saludos

Neftali [Germán.Estévez]
01-12-2011, 13:48:39
Se me ocurre que crees un TStringList, copies los elementos, ordenes y cojas el primero y el último.


O eso, o realizar un recorrido manual con un for y quedarte tú con los dos valores, pero me gusta la propuesta por fjcg02 (es que yo soy mucho de TStringList ;-D ).

fjcg02
01-12-2011, 14:14:42
O eso, o realizar un recorrido manual con un for y quedarte tú con los dos valores, pero me gusta la propuesta por fjcg02 (es que yo soy mucho de TStringList ;-D ).

Seguro que el chino es más eficiente que cualquiera de nosotros. :D Además, si alguien trabaja por nosotros, siempre nos setiremos más importantes...;)

Respecto a los stringlist, al final vía listas, se pueden hacer casi todas las cosas, y desde luego bajo mi punto de vista, son mucho más cómodas de usar que cualquier otra cosa, como arrays por ejemplo. Y si no mirad cómo funciona python...

Saludos

roman
01-12-2011, 16:51:57
Quizá no necesite un StringList:


with ListBox1 do
begin
Sorted := true;
ShowMessage(Format('Min: %s, Max: %s', [Items[0], Items[Count - 1]]));
end;


// Saludos

Neftali [Germán.Estévez]
01-12-2011, 17:48:18
Quizá no necesite un StringList

Por supuesto, si puede ordenarlo.
Tal vez hemos "asumido" equivocadamente que no podía hacerlo directamente con el control.

fjcg02
01-12-2011, 18:33:52
Efectivamente, si puede cambiar el orden de los elementos del objeto, se ahorra unas cuantas líneas de código...

Delphius
01-12-2011, 18:41:57
Si los requisitos indican que los elementos del TListBox van a estar ordenados, obtener el máximo y el mínimo se convierte en una operación elemental como bien lo apunta roman.

Ahora bien, forzar una ordenación para hacer este proceso elemental es un desperdicio.
En primer lugar no hace falta ordenar para extraer el máximo y/o el mínimo, basta con recorrer la lista y evaluar.
En segundo lugar, aún utilizando un algoritmo de ordenamiento tan rápido como QuickSort es un proceso lento comparado con un simple recorrido. QuickSort tiene en promedio una complejidad O(n * log n) mientras que un recorrido SIEMPRE es O(n).
Y aún utilizando algoritmos más avanzados que QuickSort, si fueran aplicables y viables a las necesidades, como TimSort que tiene una complejidad O(n) sigue siendo un desperdicio.

A menos que exista una verdadera necesidad de contar con los datos ordenados, es mucho más barato lanzar un for y evaluar máximo y mínimo.

Saludos,

fjcg02
01-12-2011, 19:09:06
La verdad es que es aplastante la respuesta que ofreces, Delphius, y no admite duda.

Pero haciendo un pequeño ejercicio de coste/beneficio, y teniendo en cuenta que si se trata de un listbox no debería tener demasiados elementos... me atrevería a decir que en este caso nos cuesta más la salsa que la perdiz. Y que conste que tu respuesta es "la respuesta".

Un saludo "ordenado"

roman
01-12-2011, 20:28:28
Estoy de acuerdo con Delphius, es más eficiente el recorrido simple. Además, quizá la perdiz no es tan cara (*):


var
MinMax, Val: TPoint;
I: Integer;

begin
MinMax := Point(MaxInt, -MaxInt);

with ListBox1 do
for I := 0 to Count - 1 do
begin
Val := Point(StrToIntDef(Items[I], MaxInt), StrToIntDef(Items[I], -MaxInt));

if Val.X < MinMax.X then MinMax.X := Val.X;
if Val.Y > MinMax.Y then MinMax.Y := Val.Y;
end;

ShowMessage(Format('Min: %d, Max: %d', [MinMax.X, MinMax.Y]));
end;


// Saludos

-----
(*) En México decimos que es más caro el caldo que las albóndigas :)

Delphius
01-12-2011, 22:46:37
La verdad es que es aplastante la respuesta que ofreces, Delphius, y no admite duda.

Pero haciendo un pequeño ejercicio de coste/beneficio, y teniendo en cuenta que si se trata de un listbox no debería tener demasiados elementos... me atrevería a decir que en este caso nos cuesta más la salsa que la perdiz. Y que conste que tu respuesta es "la respuesta".

Un saludo "ordenado"

Hola, fjcg02.
Pues no comprendo tu punto. Aún siendo, y con más razón, pocos los elementos del TListBox es por lejos más preferible un simple recorrido.
Lo lógico sería pensar al revés: cuanto más elementos, convendría ordenar. ¿Para que ordenar, pocos elementos? ¿Aporta en algo? En realidad, no hay beneficio alguno. Si asumiéramos que la máquina es perfecta y tuviera siempre un valor de factor c constante, aplicar un ordenamiento consume O(n), mientras que con QuickSort en el mejor caso O(n * log n). Si hacemos cálculos, que para simplificar c = 1:
n = 10 => O(n) = 10, O(n * log n) = 10. Dif = 0
n = 100 => O(n) = 100, O(n * log n) = 200. Dif = 100
n = 1000 => O(n) = 1000, O(n * log n) = 3000. Dif = 2000

Con n menores a 10 se aprecia mejor mi planteo:
n = 5 => O(n) = 5, O(n * log n) = 3,49. Dif = 1,51
n = 2 => O(n) = 2, O(n * log n) = 0,60. Dif = 1,4
n = 1 => O(n) = 1, O(n * log n) = 0. Dif = 1

No se "gana" demasiado cuando más chico sea ¿O no? ;) . Y como quedó demostrado, cuando mayor sea la lista más conveniente es el recorrido.
Esto demuestra que para pocos elementos se peca demasiado en esforzarse ordenarlos.

Incluso alguien se podría llegar a pensar que para el caso, para pocos elementos podríamos aprovechar burbuja mejorado. Ufff... ¡peor! Éste es O(n^2).

Si me explicas mejor tu punto...

Saludos,

fjcg02
01-12-2011, 23:20:36
Delphius, veo que no me pillas el punto...

En definitiva, si puedo escribir una línea de código, mejor que dos, siempre y cuando el rendimiento no penalice al usuario. Es que cuando uno es vago, es vago .... sin más... y eso, para mi vale más que cualquier cosa.

Y sí, no hace falta que me lo expliques, que tienes razón. Con runge kuta o sin él... ;)

Saludos

Delphius
01-12-2011, 23:32:31
Delphius, veo que no me pillas el punto...

En definitiva, si puedo escribir una línea de código, mejor que dos, siempre y cuando el rendimiento no penalice al usuario. Es que cuando uno es vago, es vago .... sin más... y eso, para mi vale más que cualquier cosa.

Y sí, no hace falta que me lo expliques, que tienes razón. Con runge kuta o sin él... ;)

Saludos
Ha... iba por cuestión de LDC

Es que para mi las LDC no son de todo una buen métrica de eficiencia y productividad.

Incluso aún escribiendo un ciclo como el que aportó román me animaría a decir que es poca cosa el "costo", sino me equivoqué al hacer cuentas rápidas, la V(G) es 4; y LDC/V(G) da un valor 7/4 = 1,75. Este valor es muy bajo... y me indica que no llega a 2 LDC en promedio por cada V(G) del algoritmo... algo que una simple prueba a dedo, permitiría comprobar que es un algoritmo de poca cosa.

Dime... ¿Cuántas LDC implica y V(G), requiere, indirectamente el uso de un QuickSort? ;)

Saludos,

roman
02-12-2011, 05:17:44
En definitiva, si puedo escribir una línea de código, mejor que dos, siempre y cuando el rendimiento no penalice al usuario. Es que cuando uno es vago, es vago .... sin más... y eso, para mi vale más que cualquier cosa.

Entiendo tu punto y hasta podría decir que lo apoyo. Pero en este caso sigo dándole la razón a Delphius. Vamos a ver si realmente tenemos menos líneas de código.

Asumamos, por lo que han comentado antes, que debemos usar un StringList separado para no alterar la lista original. Podríamos hacer algo así:


var
List: TStringList;

begin
List := TStringList.Create;

try
with ListBox1 do
begin
List.AddStrings(Items);
List.Sort;

ShowMessage(Format('Min: %s, Max: %s', [List[0], List[Count - 1]]));
end;
finally
List.Free;
end;
end;


Que no es tan cortito. Pero aún hay más. No sirve. De hecho, tampoco el código que puse originalmente con Sorted := true sirve (punto extra al que diga por qué no sirve :)) Hay que usar el método CustomSort del StringList y proveer una función de comparación, con lo cual yo creo que hasta rebasamos las líneas de código del recorrido simple.

// Saludos

fjcg02
02-12-2011, 08:24:42
Aquí alguien más que patinar derrapa.

1.- En mi 4º intervención ya digo que teneis razón.
2.- Mi única intención era ayudar a alguien a resolver un problema ( seguro que de la manera menos acertada )
3.- Para leer este foro e intentar ayudar a alguien quito tiempo de mi trabajo y de mi sueño, que son los que me permiten vivir económicamente y reparar mi cansancio.
4.- No me dedico profesionalmente a la programación desde hace más de 12 años, ni con delphi ni con ninguna otro lenguaje.
5.- Me siento como un palomino al que le han descerrajado 5 cartuchazos a bocajarro sin venir a cuento.

Por lo expuesto, y dado que no quiero gastar ni un ápice de esfuerzo en seguir con esta txuminada...

Ahí os quedais.

Adios ClubDelphi. Me paso a los foros de titis, que me tratan mejor... Seguid tratando así a la gente.

Adios para siempre. Sin acritud.

newtron
02-12-2011, 09:23:57
Compañeros....

Creo que nuestro amigo CarlosAlberto ha salido corriendo acojonado. :D

ecfisa
02-12-2011, 09:52:31
Compañeros....
Creo que nuestro amigo CarlosAlberto ha salido corriendo acojonado. :D
O peor aún, en un nuevo mensaje nos comenta: Muchachos, los datos de la serie se agregan al ListBox recorriendo una consulta ordenada por los mismos... :)

Saludos.

CarlosAlberto
02-12-2011, 15:57:29
Estimados amigos: probé el código del moderador Roman y funcionó, pero el de fjcg02 no.
Gracias por la ayuda.
Saludos
Carlos Alberto

roman
02-12-2011, 16:00:47
Aquí alguien más que patinar derrapa.


Supongo que me toca parte de esto. En todo caso lamento que tomes esta decisión que, espero, reviertas. Si sentiste que te estaba atacando te pido una sincera disculpa pero no era mi ánimo molestarte. Para mi, se trataba de una mera discusión academica sana. De las discusiones realizadas con respeto siempre salen cosa positivas para todos.

Como dije, te ofrezco disculpas si te sentiste ofendido y confío en que reconsideres tu decisión.

// Saludos

newtron
02-12-2011, 17:43:31
Amigo fjcg02.

Aunque me puedes decir que quien me ha dado vela en este entierro porque no he intervenido en este debate pero a lo mejor te hablo desde un punto de vista más objetivo precisamente por eso.

En los distintos mensajes de este hilo lo único que he visto es un pequeño debate sobre la conveniencia o no de usar determinadas técnicas u otras. En ningún momento he visto ningún ataque a tu persona, solo argumentos para apoyar las técnicas recomendadas.

Si es cierto que a veces estos debates se extienden demasiado por tonterías pero bueno, a mi particularmente me sirven para adquirir conocimientos que de otra manera no tendría.

De una manera o de otra pienso que todas las opiniones de todos nosotros son válidas aunque nos equivoquemos, todos estamos aquí para intentar echar una mano de la mejor forma posible y al mismo tiempo para que nos la echen cuando nos hace falta.

Resumiendo, no te enfades tío, que tu presencia en el foro es apreciada por todos con toda seguridad.

Saludos

ecfisa
02-12-2011, 21:49:58
Hola fjcg02.

Al igual que newtron, solo partipé del hilo con una observación banal. Pero me ha dejado muy mal la resolución que pensas tomar :(.

Lamento muchísimo que se provoque esta situación por una diferencia de criterios, que según creo, no teniá intención agraviante.
De todos modos, si te has sentido herido por lo que alguién ha dicho, apelando a tu tolerancia te pido por favor que no castigues al resto de los integrantes, privándonos de tus valiosos aportes.

Espero sea nada más que un disgusto pasajero y pueda verte cuanto antes por aquí.

Un saludo. :)

Delphius
02-12-2011, 23:15:31
Aquí alguien más que patinar derrapa.

1.- En mi 4º intervención ya digo que teneis razón.
2.- Mi única intención era ayudar a alguien a resolver un problema ( seguro que de la manera menos acertada )
3.- Para leer este foro e intentar ayudar a alguien quito tiempo de mi trabajo y de mi sueño, que son los que me permiten vivir económicamente y reparar mi cansancio.
4.- No me dedico profesionalmente a la programación desde hace más de 12 años, ni con delphi ni con ninguna otro lenguaje.
5.- Me siento como un palomino al que le han descerrajado 5 cartuchazos a bocajarro sin venir a cuento.

Por lo expuesto, y dado que no quiero gastar ni un ápice de esfuerzo en seguir con esta txuminada...

Ahí os quedais.

Adios ClubDelphi. Me paso a los foros de titis, que me tratan mejor... Seguid tratando así a la gente.

Adios para siempre. Sin acritud.
Hola fjcg02,
Yo no veo que te hayan atacado. Y como se vinieron dando últimamente las cosas por aquí yo diría, que mis palabras no han ido cargadas de ningún sentimiento de pelea.
Solamente se ha presentado un debate, y nadie se ha expresado en tu contra.

Saludos,

Casimiro Notevi
03-12-2011, 10:12:49
¿Pero qué ha pasado aquí?, es que no os puedo dejar solos ni un momento :)

No había entrado en este hilo porque por el título veo que es algo simple y que como había varias respuestas de gente que sabe: fjcg02, Neftali, roman, Delphius... y ahora newtron y ecfisa... pues me dije: "para qué voy a entrar en ese hilo si no voy a aportar nada especial". El caso es que me extrañaba que tuviese tantas entradas para algo tan simple y entonces entro y me encuentro esto :eek:

Bueno, lo he leido de principio a fin, ordenado por su número de entrada y no veo ningún ataque a tu persona, fjcg02, creo que seguramente estás muy susceptible con el cambio de gobierno que hemos tenido o porque se han estropeado los planes de este fin de semana para ir a esquiar al Pirineos francés... porque no hay nieve :D
Pues eso, amigo, que me ha parecido sólo un debate, con sus comentarios a favor o en contra, y que alguno(s) se han equivocado al leer las repuestas de otro(s)... y las ha malinterpretado, pero nada más que eso.

En fin, que reconsideres tu decisión porque ir a un foro de "titis" es un problema gordo si estás soltero (salen muy caras), y un problema más gordo todavía si estás casado (no hace falta que explique los motivos :D), aquí al menos no te cuesta nada y puedes hablar lo que quieras :)

¡¡¡Saludos!!!

fjcg02
05-12-2011, 08:46:19
Hola a todos de nuevo,

tras un fin de semana sin conexión, en el que he puesto la distancia suficiente al asunto, quería comentaros lo siguiente.

1.- No acepto vuestras disculpas, ya que sinceramente no creo que hicieran falta ofrecerlas.
2.- Aceptad las mias por reaccionar creo que de manera desproporcionada a una situación que no me molestó excesivamente, sino que me dejó sobre todo sorprendido.

Lo dicho, siento haberme puesto un poco txorra, ya que creo que no mereciais una respuesta así y una reacción como indicais, que no cuadra con el contenido del hilo.

Creo que tengo que hacer caso a la gente de mi alrededor, que me dicen que me relaje... aunque hay situaciones ( generales e personales ) que no facilitan un clima de calma.

Y sobre todo CarlosAlberto, no huyas, vuelve, que esto no es lo normal en este club... !

Lo dicho, recapacitar es de sabios, por lo que me seguireis soportando por aqui. Ahora, intentaré responder con respuestas más precisas y sobre todo... más relajado.

Saludos

newtron
05-12-2011, 09:32:00
Y sobre todo CarlosAlberto, no huyas, vuelve, que esto no es lo normal en este club... !


Amigo fjcg02.

Siento comunicarte que CarlosAlberto me ha mandado un privado diciendome que deja la informática definitivamente y se va a dedicar a la construcción que parece que tiene mejor futuro. :D

Saludos

fjcg02
05-12-2011, 09:52:17
Amigo fjcg02.

Siento comunicarte que CarlosAlberto me ha mandado un privado diciendome que deja la informática definitivamente y se va a dedicar a la construcción que parece que tiene mejor futuro. :D

Saludos

No es broma, uno de los grandes conflictos que tengo es si seguir en este mundo ( el profesional de las tic's , no que me vaya a suicidar ... ) o hacerme frutero ... o del gremio de la construcción !! Seguro que trabajan menos y están más reconocidos, y no tienen que estar en casa estudiando gilipolleces nuevas...persoón nuevas tecnologías que hacen siempre lo mismo, o sea, una pantallita con clientes, proveedores, artículos, .... Por lo menos tienen convenio propio, no el de oficinas y despachos.

Saludos

newtron
05-12-2011, 10:29:43
No es broma, uno de los grandes conflictos que tengo es si seguir en este mundo ( el profesional de las tic's , no que me vaya a suicidar ... ) o hacerme frutero ... o del gremio de la construcción !! Seguro que trabajan menos y están más reconocidos, y no tienen que estar en casa estudiando gilipolleces nuevas...persoón nuevas tecnologías que hacen siempre lo mismo, o sea, una pantallita con clientes, proveedores, artículos


Bueno, nadie dice que este sea un negocio fácil pero yo particularmente creo que ninguno lo es, en todos lados cuecen habas y los problemas son distintos pero los hay. Nosotros tenemos la ventaja de que al menos trabajamos en algo que nos gusta porque si no, no trabajariamos en esto.


.... Por lo menos tienen convenio propio, no el de oficinas y despachos.

Los convenios es lo de menos, todo se negocia.

fjcg02
05-12-2011, 10:48:09
Bueno,
ya sabeis que siempre vemos lo bueno de los demás y lo malo de lo propio...

No me tomeis por un pelele, conozco cómo se las gastan en casi todos los lados, y desde luego, que desde bien joven he sabido apreciar lo que es trabajar en una oficina, sin pasar frío, calor, ... y penurias varias. No sé vosotros, pero donde yo vivo ( excepto este año, que esto parece Benidorm porque hasta la semana pasada no hemos encendido la calefacción ) desde mediados de Octubre hasta casi Mayo, la climatología no es que sea muy benévola, o sea, que trabajar en la calle es un marrón. Cuando veo a jardineros, los que preparan carreteras, los de obras públicas, los trabajadores de la construcción, etc los días que llueve y hace frío, no veais cómo aprecio mi jodido trabajo. no me extraña que tengan que meterse un SolySombra ( coñac y anís) entre pecho y espalda para desayunar ! Es que si no, ni empiezan.

Pero en algún lado tengo que llorar un poco, que en otros lados no me dejan.

Saludos
PD: perdonad por la chapa, pero es que cuando estoy de bajón...

Casimiro Notevi
05-12-2011, 11:26:06
Yo también he pensado muchas veces cambiar de trabajo, no sé, vender patatas, creo que es lo mejor, no tienes que aprender lenguajes, algoritmos ni cargarlas en memoria, tampoco tienen garantía de 2 años y lo más importante, todo el mundo sabe usarlas, nadie llama al soporte técnico preguntando: "hola, al freir la patata me sale un mensaje de error, ¿me lo puedes arreglar?".
Así que no necesitan modificaciones, parches, mejoras ni se le añaden nuevos módulos de esos que tienes que modificar casi toda la patata (programa) para adaptarlo.
Tampoco tienes que negociar la forma de pago, se paga al contado y punto. Nada de tonterías como pagar un alquiler por la patata. Si por no tener, no tiene ni licencias: "oiga, que la licencia de su kilo de patatas caduca el mes próximo, si quiere seguir usándolas tendrá que abonar un nuevo año de licencias para 3 comensales".
Tiene otras ventajas, puedes elegir el horario, por ejemplo, decides vender patatas de 9 a 14 y descansar por las tardes. Cuando cierras la puerta ya nadie te llama preguntando por la patata ni te avisan con una urgencia: "rápido, ven que se me ha atascado la patata y tengo aquí a toda la gente haciendo cola para facturar". Nada de eso, cierras la puerta y te vas a pasear en bici, a pintar un cuadro o a hacer fotos a las palomas del parque, hasta el día siguiente. No te pasas todo el día pensando en las patatas, día y noche, soñando con las patatas, pensando en la mejor manera de optimizarlas para que la consulta sql sea instantánea.
En fin, que todo son ventajas, aunque el único problema que le veo es que no me gusta vender patatas.
Ya en serio, (aunque lo de antes también es en serio), nuestro trabajo es mucho más esclavo de lo que le parece "a la gente", no tienes descanso nunca porque siempre estás con el programa en la cabeza, todos los días a todas las horas, de lunes a domingo, includo todas las fiestas, por ejemplo estos días que vienen de fiesta, en lugar de pensar: "qué bien, varios días de fiesta para no hacer nada", yo he pensado: "qué bien, puedo avanzar el programa aprovechando que los demás están sin hacer nada y no van a meterme prisa porque están 'desconectados'" hasta el lunes próximo.

newtron
05-12-2011, 11:52:48
Yo también he pensado muchas veces cambiar de trabajo, no sé, vender patatas

Creo que todos hemos pensado lo mismo en alguna ocasión, yo en particular en muchas ocasiones. Al final llego a la conclusión de lo que he comentado antes, "en todos lados cuecen habas", seguro que si le preguntas al vendedor de patatas te dirá que estaría loco por ser informático, todo el día sentado delante del ordenador, tranquilito, con su calefacción/aire acondicionado, conexión a internet para ver chicas desnudas de vez en cuando, un buen sueldo, un trabajo reputado, etc etc. Vosotros que conocéis el mercado ¿qué pensais? que el de las patatas flipa, que no tiene ni idea de lo que es esto, pues eso mismo pensará él, que nosotros no tenemos ni idea, el precio de las patatas fluctua mucho según el tiempo, el mercado, plagas, etc., las patatas no tienen casi margen, se estropean pronto y las "marujas" que van a comprar no hay quien las aguante.

En fin... no sé si alguna vez lo he comentado en algún hilo pero lo importante hagas lo que hagas es encontrar el "equilibrio" en uno mismo para que pase lo que pase intentar no romper esa paz interior que es tu estado de ánimo. También es cierto que todo esto es bastante más fácil de decir que de poner en práctica pero hay que intentarlo.

Joder, estoy de un místico...... :D:D

CarlosAlberto
05-12-2011, 15:43:35
Estimados miembros del Club:
En ningún momento he manifestado dejar de aprender y de hacer programas sencillos en Delphi, tal vez sea otro miembro del club con nombre parecido.

Pasando a otro tema: hace unos días les pregunté como instalar un paquete que me recomendaron (calc.zip) para poder introducir fórmulas matemáticas en una caja de edición y que se lean como tal, lo que sucede es que nunca instalé un paquete en ningún delphi, es decir no sé hacerlo. Ahora tengo Delphi 2009 y me gustaría que me guiaran para poder instalarlo.
Muchas gracias.
CarlosAlberto

Casimiro Notevi
05-12-2011, 15:52:44
Pues ahora es cuando te recuerdo la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php) y digo eso de: nuevas preguntas... en nuevos hilos ;)

fjcg02
05-12-2011, 18:15:13
... hagas lo que hagas ...

...Ponte bragas.

Bragas Ponte, las más bonitas. (Almodobar hace dos decenios )

Saludos