Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: Bazooka en Junio 08, 2011, 02:10:19 pm

Título: Como puedo ordenar esto? (Solucionado)
Publicado por: Bazooka en Junio 08, 2011, 02:10:19 pm
Hola yo siempre con las cosas raras!!
Como puedo ordenar esto?
tengo unas matriz de cadenas que en realidad tienen números pero de esta manera:

Mat(0)=12 90 33
Mat(1)=34 56
Mat(2)=90 56 33 45
Mat(3)=9

Y necesataría que se ordene por la que contiene menos cantidad de numeros separados pro espacio lo que deberia quedar asi:

mat(0)=9
mat(1)=34 56
mat(3)=12 90 33
mat(4)=90 56 33 45

Gracias por su ayuda!!

Mike


 
Título: Re:Como puedo ordenar esto?
Publicado por: czar9 en Junio 08, 2011, 04:44:38 pm
Podrias separar con un modulo par tokens no lo escribi yo. pero ya no encontre la pagina del programador

http://www.megaupload.com/?d=W261JZZ0 (http://www.megaupload.com/?d=W261JZZ0)

También puedes usar la función split

con esto sabras cuantos numeros separados (tokens) por un espacio (delimitador) tienes en cada cadena del arrerglo, ya solo faltaria hacer la relacion y hacer intercambios de tus cadenas en el arreglo por ejemplo podrias arreglarla por burbuja, considerando algo asi

a(0)= "34 45 56"     en una funcion valor(a(0))    donde regreses  el numero de tokens.

Para tener algo asi

Mat(0)=12 90 33                   aux(0) = valor (Mat(0))  'valdria 3
Mat(1)=34 56                        aux(1) = valor (Mat(1))  'valdria 2
Mat(2)=90 56 33 45              aux(2) = valor (Mat(2))  'valdria 4
Mat(3)=9                               aux(3) = valor (Mat(0))  'valdria 1

Asi aplicas un sort tipo burbuja o el que quieras sobre aux, y los intercambios en los indices de aux, los manejas en Mat tambien... si te das cuenta en la logica ni siqueira utilizarias otro arreglo auxiliar como aux.

No importa que sean raras tus preguntas... si no que les des continuidad al tema, que por cierto por ahi debes una respuesta.

te pondria el codigo... pero luego no tienes tiempo de revisar  :-[

Saludos
Título: Re:Como puedo ordenar esto?
Publicado por: Bazooka en Junio 09, 2011, 04:46:59 pm
Perdon no me da para resolverlo lo voy a intentar de nuevo mañana!!!

Título: Re:Como puedo ordenar esto?
Publicado por: czar9 en Junio 09, 2011, 05:50:44 pm
Perdon no me da para resolverlo lo voy a intentar de nuevo mañana!!!


Como que no!!!!!!!!!!!!!!!!!   triste muy triste  :'(
Te pongo el código que comprueba que sirve!!  ;D

Para aclarar en el codigo creo que esta linea seria la mas extraña o aparente sin lógica
UBound(Split(Mat(i), " ")) + 1

Explicación
split(Mat(i)," ")
La funcion split regresa un array base zero "cortando" la cadena en subcadenas, cada que encuentra el delimitador
split(Mat(i)," ")
ejemplo
es decir cada que la cadena tiene un " " lo pone en un espacio en el arreglo
Mat(i) tiene por valor la cadena "12 90 33" al ejecutar split("12,90,33"," ") nos regresaría un arreglo
(0) = "12"
(1) = "90"
(2) = "33"
aqui hay que ver que el indice superior es de 2, pero como es base zero tendriamos 3 elementos o lo que es lo mismo, calculamos el indice superior y le sumamos 1 para obtener la cantidad de elementos. por eso uso ubound para calcular el indice superior y le sumo 1 par tener el numero de elementos en ese arreglo.

Es decir sorteamos un arreglo en base a al cantidad de numeros separados por un espacio, para obtener esa cantidad usamos split apra separarlos ubound para contarlos y le sumamos el 1 por el cero...


y aca el código que prueba que la lógica... sirve =)




Código: [Seleccionar]
Private Sub Form_Load()
Dim Mat(3) As String
Mat(0) = "12 90 33"
Mat(1) = "34 56"
Mat(2) = "90 56 33 45"
Mat(3) = "9"

'algoritmo de la burbuja
Dim iMin    As Long
    Dim iMax    As Long
    Dim Vectemp As String                   ' -- variable temporal
    Dim Pos     As Long
    Dim i       As Long
 
    iMin = LBound(Mat)
    iMax = UBound(Mat)
     
    While iMax > iMin
        Pos = iMin
        For i = iMin To iMax - 1
           
            If UBound(Split(Mat(i), " ")) + 1 > UBound(Split(Mat(i + 1), " ")) + 1 Then
            Vectemp = Mat(i + 1)
            Mat(i + 1) = Mat(i)
            Mat(i) = Vectemp
            Pos = i
            End If
        Next i
        iMax = Pos
    Wend
       
    'mostrar el arreglo
    iMin = LBound(Mat)
    iMax = UBound(Mat) 'como al final de burbuja este valor cambia, lo recalculamos
    For i = iMin To iMax
     MsgBox Mat(i)
    Next i
   
End Sub
Título: Re:Como puedo ordenar esto?
Publicado por: Juan Luis López en Junio 09, 2011, 06:21:57 pm
usa el método de la burbuja usando como elemento a comparar len(Matriz(indice))
Título: Re:Como puedo ordenar esto?
Publicado por: Bazooka en Junio 09, 2011, 06:37:53 pm
GRande Czar9 !!! Eres un genio Si que funciona!!! y de verlo asi parece tan simple...  Pero no se me ocurrio!!  me falta mucho parece  ... jajaj

Muchas Gracias!!


  • No hagas "Citas" extensas e innecesarias, solo cita lo mas importante.

Título: Re:Como puedo ordenar esto?
Publicado por: czar9 en Junio 09, 2011, 06:40:07 pm
usa el método de la burbuja usando como elemento a comparar len(Matriz(indice))

esto daría la cantidad de caracteres..... no la cantidad de tokens

Mat(0) = "34 56"

len(Mat(i))
lo cual valdria 5 y seria incorrecto!!!

en cambio con
UBound(Split(Mat(i), " ")) + 1
valdria un 2, que es la cantidad correcta de números separados por un espacio....  ::)