Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado 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
-
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
-
Perdon no me da para resolverlo lo voy a intentar de nuevo mañana!!!
-
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 =)
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
-
usa el método de la burbuja usando como elemento a comparar len(Matriz(indice))
-
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.
-
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.... ::)