Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado]
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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://www.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 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 




===================
No podemos regresar
 
última edición por shordi el Lunes, 03 Diciembre 2018, 16:35; editado 1 vez 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado] 
 
Enhorabuena por la solución, intentare probarlo pronto como ejemplo para aprender cosas nuevas.

El padawan
 



 
Kik3 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado] 
 
excelente
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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?

captura_de_pantalla_2018_12_03_15_33_04 captura_de_pantalla_2018_12_03_15_33_18
Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

    Dim a As New String[]
    Dim i, n As Integer
    Dim awords As String[]

 awords = Split(File.Load("lorem.csv"))
    For i = 0 To 10000
        a = New String[]
        For n = 0 To 3
            a.Add(awords[Rand(0, 100)])
        Next
        $arData.Add(a)
    Next  


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 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado] 
 
Mejor actualizo el ejemplo y lo bajas otra vez...
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado] 
 
Actualizado. Ahora sólo se cargan los datos al abrir el programita.

Saludos
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenando Arrays Multidimensionales: Se Buscan Ideas. [Solucionado] 
 
shordi escribió:  
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.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Preguntas Sobre Los Arrays De Controles. (... nicoobe Controles/Librerías/Componentes 3 Miercoles, 23 Junio 2010, 21:48 Ver último mensaje
Emmet
No hay nuevos mensajes Mostrar Arrays Dentro De Otro Arrays Shell General 9 Domingo, 07 Diciembre 2014, 20:30 Ver último mensaje
Shell
No hay nuevos mensajes Funciones Que Regresan Arreglos Multidimen... cyberx0x General 1 Miercoles, 21 Octobre 2009, 03:10 Ver último mensaje
nrcefe
No hay nuevos mensajes Se Buscan Pilotos De Pruebas Para Generado... shordi Aplicaciones/Fragmentos de Código 18 Jueves, 24 Marzo 2011, 17:40 Ver último mensaje
GilGalad
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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
No puede descargar archivos
No puede publicar eventos en el calendario