| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Mar 23 Nov, 2004 10:19 am Asunto: Ordenar alfabeticamente numeros |
|
|
como puedo ordenar alfabeticamente un ListBox, bueno en realidad es uno de LMD de los que te dejan partir en paneles con un caracter delimitador(no me acuerdo de su nombre) pero bueno el ListBox es igual.
Mi pregunta es ordenarlo alfabeticamente de forma que si es
1
2
3
4
20
No me salga
1
2
20
3
4
Me salga como es .... me explico?? _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 23 Nov, 2004 4:44 pm Asunto: |
|
|
| Código: | this->ListBox1->Sorted = true; |
Si esta propiedad deriva, dentro del componente LMD tools, esta echo..
saludos. _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 24 Nov, 2004 1:24 pm Asunto: |
|
|
Creo que con lo que sugiere César la tabla se mostraría como dice Fernando, ya que hace una evaluación de los códigos de los caracteres y no de los valores si estos son numéricos. Al poner Sorted a true un valor 20, 21, 22, etc. siempre irá delante del 3 _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Mie 24 Nov, 2004 2:37 pm Asunto: |
|
|
exacto si e probado con el sorted pero por eso digo que no me vaya antes un 20 que un 3 tal y como pasa con el sorted
alguna idea? _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mie 24 Nov, 2004 5:03 pm Asunto: |
|
|
| La solución tradicional de trabajar con 01, 02, ... (ó 001, 002, ... si piensas que habrá más de 100 valores, o ...) ¿no te sirve? |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mie 24 Nov, 2004 5:50 pm Asunto: |
|
|
Hola.
Yo lo que haría sería crear un vector auxiliar donde guardaría el valor numérico del item en cuestión. Luego los ordenaría con un algoritmo de ordenación (burbuja, quicksort, etc) y guardaría la posición previa del item. Por último, añadiría los items según el nuevo orden de la posición en el vector ordenado (no sé si me he explicado bien, espero que sí).
Un saludo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Mie 24 Nov, 2004 9:11 pm Asunto: |
|
|
Lo voy a hacer como dice enrique  _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Mie 24 Nov, 2004 9:15 pm Asunto: |
|
|
Pero .... al hacer una variable int =01 y hacerr luego el ++ o +=01 se me quita el 0
 _________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mie 24 Nov, 2004 10:44 pm Asunto: |
|
|
Hacer a una variable es lo mismo que asignarle un 1. Sin embargo no es lo mismo hacer que pues al escribir un 0 delante de un número entero tu compilador entenderá que le estas hablando en octal, osea si le dices que vale 010 le estás diciendo que su valor en decimal es 8. Ten cuidado con esos detalles.
Por otro lado, tu problema no está en que C no sepa ordenar los números enteros en su orden natural, el problema está en que lo que está ordenando son los caracteres de un AnsiString, por lo que 1xxxxx siempre será "menor" que 2.
Lo que necesitas es usar una función AnsiString de formato, en la que le digas cuántos dígitos ha de tener obligatoriamente el número que le pases: | Código: | AnsiString nombre;
int numero = 0;
nombre = FormatFloat("00", numero++); // nombre = "00"
nombre = FormatFloat("00", numero++); // nombre = "01"
nombre = FormatFloat("00", numero++); // nombre = "02"
//...
nombre = FormatFloat("0000", numero++); // nombre = "0003"
nombre = FormatFloat("0000", numero++); // nombre = "0004"
//... | En la ayuda de BCB tienes más ejemplos de cómo formatear números expresándolos con caracteres.
Suerte. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 25 Nov, 2004 6:04 pm Asunto: |
|
|
en vista, que no se puede, como se debiera, ya que las cadenas, son tratadas como ascci, bueno, lo ordenamos por burbuja, (fue el ordenamiento que se me ocurrio al momento)
pon esto en el codigo, y funciona
| Código: | void __fastcall TForm1::Button1Click(TObject *Sender)
{
// bueno ordenalo por burjbuja, jeje
AnsiString cTmp;
for(int i=this->ListBox1->Items->Count;i>0;i--){
for(int j=0 ; j < i-1 ; j++){
if( (this->ListBox1->Items->Strings[j].ToInt()) > (this->ListBox1->Items->Strings[j+1].ToInt()) ){
cTmp = this->ListBox1->Items->Strings[j];
this->ListBox1->Items->Strings[j] = this->ListBox1->Items->Strings[j+1];
this->ListBox1->Items->Strings[j+1] = cTmp;
}
}
}
}
//--------------------------------------------------------------------------- |
_________________
 |
|
| Volver arriba |
|
 |
Fernando Diaz Master


Registrado: 18 Jul 2004Mensajes: 273Ubicación: Talavera de la Reina (Toledo)
|
Publicado: Dom 28 Nov, 2004 11:59 am Asunto: |
|
|
Lo siento pero con el metodo de la burbuja me queda asi
1
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
3
4
5
6
7
8
9
2
he quitado el sorted y todo y se que da asi
Uso este codigo es = pero para el TLMDListBox
| Código: | AnsiString cTmp;
for(int i=this->tabla->Items->Count;i>0;i--){
for(int j=0 ; j < i-1 ; j++){
if( (this->tabla->ItemPart(j,1).ToDouble()) > (this->tabla->ItemPart(j+1,1).ToDouble()) ){
cTmp = this->tabla->Items->Strings[j];
this->tabla->Items->Strings[j] = this->tabla->Items->Strings[j+1];
this->tabla->Items->Strings[j+1] = cTmp;
}
}
}
|
_________________ Los problemas mas dificiles tienen las soluciones mas sencillas
 |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 29 Nov, 2004 5:27 pm Asunto: |
|
|
Algo Imposible, no puedo creer, que despues de comparar el 3 con el 10, en formato numerico, siga siendo el 3 mas grande que el 10, a mi me funciona perfectamente..
checa tu codigo.. por que no es posible..
saludos
aun que te dire, que veo diferencia, entre esto
| Código: | if( (this->tabla->ItemPart(j,1).ToDouble()) > (this->tabla->ItemPart(j+1,1).ToDouble()) ) |
y esto
| Código: |
// aqui con corchetes y tu con parentesis
if( (this->ListBox1->Items->Strings[j].ToInt()) > (this->ListBox1->Items->Strings[j+1].ToInt()) ){ |
_________________
 |
|
| Volver arriba |
|
 |
Perico Invitado
|
Publicado: Mar 30 Nov, 2004 10:33 am Asunto: |
|
|
| Yo lo que haria seria algo como lo que dice Cesar, es decir, comparar cada linea del ListBox utilizando StrToInt para comparar el valor numerico. No hay otra forma. |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Mar 30 Nov, 2004 3:43 pm Asunto: |
|
|
| esque uso un TLMDListBox |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 30 Nov, 2004 5:19 pm Asunto: |
|
|
Bien a ciencia cierta, es muy dificil, checarlo asi, por que no pones tu codigo para que todos observemos como lo estas ordenado y cual es el componente que utilizas..
saludos.. _________________
 |
|
| Volver arriba |
|
 |
|