|
Página 1 de 1
|
Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Autor |
Mensaje |
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
El problema:
Estoy diseñando un control tipo GridView que es capaz de visualizar un array de dos dimensiones. Quiero que al hacer click en la cabecera de cualquier columna ésta haga lo habitual: un click orden de la A a la Z, otro click orden de la Z a la A y otro click, no ordenar por esa columna... sumando el criterio de ordenación a los criterios de ordenación ya existentes.
El tema de los clicks y de lo demás está solucionado... pero me falta el meollo del asunto: la ordenación por varias columnas.
Es relativamente simple ordenar un array de dos dimensiones por una columna, no hace mucho vimos en este foro varias soluciones ( https://foro.gambas-es.org/viewtopic.php?f=1&t=7123&p=42975) pero allí nos limitamos a ordenar por una columna. Lo que ahora necesito es ordenar por varias columnas y que cada una de ellas pueda ser ascendente o descendente.
Confieso que llevo cuatro días pegándome con el tema, que he creído más de una vez que lo tenía solucionado y que al final me he rendido de hacerlo solo. ¿Alguien tiene alguna idea de cómo enfocar el asunto antes de que me vuelva loco?
Hay una solución "tramposa": pilla tu array bidimensional, crea con él una base sqlite y deja que el motor de sqlite solucione el asunto con una sentencia SQL... pero no es el caso (obligaría al proyecto a enlazar con los módulos de base de datos y no siempre es eso conveniente)
=================== No podemos regresar
última edición por shordi el Lunes, 03 Diciembre 2018, 11:20; editado 2 veces
|
#1 Sabado, 01 Diciembre 2018, 19:00 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas.
He pasado el asunto a la lista internacional también, a ver si entre todos se puede encontrar un modo.
Saludos.
=================== No podemos regresar
|
#2 Sabado, 01 Diciembre 2018, 19:14 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas.
¡Solucionado!
Me ha costado casi una semana de volverme loco y alucinaríais con la de cosas que he probado, desde duplicar los algoritmos clásicos de ordenación hasta grabar las cosas en una base Sqlite para que ella haga el trabajo... pasando por dividir las tablas en columnas independientes con su clave en cada celda y no sé cuántas cosas más. Al final, una inspiración mientras dormía la siesta- ¡esto es España! (dicho como en la peli de 300) - me ha dado una solución sencilla y chusquera.
El gran problema son las claves descendentes. Ordenar por una columna y luego por otra y otra, etc. es sencillo si todas las claves son del mismo tipo pero en el momento en que una de ellas es inversa... ¿qué haces? Solución: cámbiala para que sea del mismo tipo. La verdad de perogrullo, pero me ha llevado una semana dar con ella.
Así todo se ha solucionado con una pequeña función que "invierte" los caracteres según su valor:
Public Sub reverse(cad As String) As String
Dim n, i, l As Integer
Dim sRet As String
''If the arrays below are private this function is more fast
Dim aNoascii As String[] = ["á", "é", "í", "ó", "ú", "ñ", "ü", "Á", "É", "Í", "Ó", "Ú", "Ü", "Ñ", "ª", "º", "(", ")", ".", ",", "-"]
Dim aascii As String[] = ["a", "e", "i", "o", "u", "ny", "u", "a", "e", "i", "o", "u", "u", "ny", " ", " ", " ", " ", " ", " ", " "]
Dim aAscent As String[] = [" ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
Dim aDescent As String[] = ["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a", "9", "8", "7", "6", "5", "4", "3", "2", "1", "0", " "]
cad = LCase(cad)
For n = 0 To aNoascii.Max 'Loop to replace all non ascii characters with ascii characters. e.g. replace "á" with "a"
If InStr(cad, aNoascii[n]) Then
cad = Replace(cad, aNoascii[n], aascii[n])
Endif
Next
l = Len(cad) - 1
For n = 0 To l 'Loop to "invert" the characters
i = aAscent.Find(Mid(cad, n + 1, 1))
If i = -1 Then i = 0
sRet &= aDescent[i]
Next
Return sRet
End
Si esta función recibe digamos la palabra "aba", devuelve "zyz" ¡Se acabaron las ordenaciones descendentes!
Además es rápida. En mi ordenador tarda algo menos de 1 segundo por cada 10000 filas en la tabla.
Como yo me muevo normalmente con tablas por debajo de 5000 registros, eso lo hace casi instantáneo.
os adjunto un ejemplo por si a alguien le sirve de algo.
Descripción: |
|
Descargar |
Nombre del archivo: |
sortTable-0.0.1.tar.gz |
Tamaño: |
22.55 KB |
Descargado: |
18 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
sortTable-0.0.1.tar.gz |
Tamaño: |
22.55 KB |
Descargado: |
18 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
sortTable-0.0.1.tar.gz |
Tamaño: |
22.55 KB |
Descargado: |
18 veces |
=================== No podemos regresar
última edición por shordi el Lunes, 03 Diciembre 2018, 16:35; editado 1 vez
|
#3 Lunes, 03 Diciembre 2018, 11:19 |
|
|
Kik3
Usuario
Registrado: Noviembre 2018
Mensajes: 1
Edad: 46
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Enhorabuena por la solución, intentare probarlo pronto como ejemplo para aprender cosas nuevas.
El padawan
|
#4 Lunes, 03 Diciembre 2018, 11:32 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
excelente
|
#5 Lunes, 03 Diciembre 2018, 12:21 |
|
|
tincho
Analista Programador
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Hola Shordi, mira he descargado el ejemplo que dejaste para echarle un vistazo y encontre que cada vez que ordeno (dando click al boton) se ordena diferente.
Si los parámetros de oren no varían ¿Por que la tabla queda diferente después de cada click?
Saludos.
|
#6 Lunes, 03 Diciembre 2018, 15:40 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Porque cada ve que haces click son datos distintos. Se crean desde un fichero de palabras adjunto en filas de 10 usando la función rand(0,100).
Cambia las líneas
Al evento Form_Open() y se trabaja siempre con los mismos datos.
Culpa mía
=================== No podemos regresar
última edición por shordi el Lunes, 03 Diciembre 2018, 16:32; editado 1 vez
|
#7 Lunes, 03 Diciembre 2018, 16:31 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Mejor actualizo el ejemplo y lo bajas otra vez...
=================== No podemos regresar
|
#8 Lunes, 03 Diciembre 2018, 16:32 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Actualizado. Ahora sólo se cargan los datos al abrir el programita.
Saludos
=================== No podemos regresar
|
#9 Lunes, 03 Diciembre 2018, 16:36 |
|
|
tincho
Analista Programador
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
|
Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Actualizado. Ahora sólo se cargan los datos al abrir el programita...
Ok, ahora si que va.
Por otra parte, hace un tiempo hice algo con un grid que hace esto que decís de ordenar por varias columnas, pero el método trabaja con la consulta SQL directamente, lo cual no te serviría puesto que lo que queres es ordenar el grid en si.
Saludos.
|
#10 Lunes, 03 Diciembre 2018, 21:05 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|