Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Ordenar Una Matriz De Dos Dimensiones [SOLUCIONADO]
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Ordenar Una Matriz De Dos Dimensiones [SOLUCIONADO] 
 
Tengo que ordenar unos datos que guardo en una matriz de dos dimensiones.
Es un variant[] que contiene una serie de string[]
La ordenación puede ser por cualquiera de los elementos de los String[]
¿Alguien tiene alguna rutina preestablecida o tengo que reinventar la rueda otra vez?

Saludos
 



 
última edición por shordi el Miercoles, 03 Abril 2013, 10:30; editado 1 vez 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenar Una Matriz De Dos Dimensiones 
 
Shordi:

Mirate este enlace, a lo mejor te da alguna idea de como lo puedes hacer:

http://foro.gambas-es.org/viewtopic...ghlight=compare


Saludos

Nota:
Aqui hay otro ejemplo (es más simple):  http://cursogambas.blogspot.com.es/...emove-find.html
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Miercoles, 03 Abril 2013, 09:19; editado 1 vez 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenar Una Matriz De Dos Dimensiones 
 
Añadiendo un poco mas:

Lo suyo es que tuvieses una propiedad que indicara el campo a ordenar (o indice del array string[], por el que quieres ordenar), y en el método compare, le ponca un select case, que segun el valor de ese indice, haga la comparacion....

propiedad indice as integer
private hindice as integer



Public Function _compare(Other As ClassPersona) As Integer
select case hindice
case 1
' Return Sgn(hedad - Other.edad)
If hnombre > Other.nombre Then Return 1
Return -1
case 2
If hapellido > Other.apellido Then Return 1
Return -1

......


End

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenar Una Matriz De Dos Dimensiones 
 
Gracias Julio, me apunto tu solución para futuras referencias pero, de momento, y dadas las prisas que llevo con ésto, he hecho una pequeña función que soluciona el problema... soslayándolo.
No es elegante, pero funciona. Sólo para un array de string[], de momento.

Los pasos son:
1.-Añado al inicio de cada elemento string[] la columna a ordenar.
2.-Convierto el string[] en una cadena separando con "~"
3.-Ordeno esa cadena según el método de ordenación pasado.
4.-Recreo el string[] original eliminado la primera columna (la que añadí en el paso 1)


Public Sub ordenar(ar As Variant[], elemento As Integer, Optional modo As Integer) As Variant[]
    
    Dim linea, lineas As String[]
    Dim aRetorno As New Variant[]
    Dim cad As String
    
    If Not modo Then modo = gb.Ascent   'modo ascendente por defecto
    lineas = New String[]
    For Each linea In ar                           'recorro el variant[] original
        linea.Add(linea[elemento], 0)         'inserto en primera posición la columna por la que quiero ordenar
        cad = linea.Join("~")                     'uno todos los elementos en una cadena
        lineas.Add(cad)                             'añado esa cadena al string[] lineas
    Next
    lineas.Sort(modo)                             'ordeno
    For Each cad In lineas
        linea = Split(cad, "~")                   'vuelvo a dividir la cadena en un string[]
        linea.extract(0)                            'Elimino el primer elemento usado para ordenar
        aRetorno.Add(linea)                           'añado el string[] al variant
    Next
    Return aRetorno                                    'retorno el variant reordenado
        
End

 


El contexto en el que lo estoy utilizando es en un gridview que muestra el contenido de un Array de dos dimensiones. El evento Column_Click ordena el gridView ascendente o descendente. Ya subiré un ejemplo cuando vaya más tranquilo.
Cambio el título a Solucionado.

Saludos
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenar Una Matriz De Dos Dimensiones [SOLUCIONADO] 
 
Shordi:


Citar:
1.-Añado al inicio de cada elemento string[] la columna a ordenar.
2.-Convierto el string[] en una cadena separando con "~"
3.-Ordeno esa cadena según el método de ordenación pasado.
4.-Recreo el string[] original eliminado la primera columna (la que añadí en el paso 1)


Esta curioso el método.... me lo apunto.


Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ordenar Una Matriz De Dos Dimensiones [SOLUCIONADO] 
 
No me era suficiente para lo que quiero que sólo ordenase string[]. He tenido que modificarlo para que también lo haga si hay algún elemento numérico.
Así queda:
Public Sub ordenarA2D(ar As Variant[], elemento As Integer, Optional modo As Integer) As Variant[]
    
    Dim linea As Variant[]
    Dim clinea, lineas As String[]
    Dim aRet As New Variant[]
    Dim cad As String
    Dim n, i As Integer    

    aret = ar.Copy()
    If Not modo Then modo = gb.Ascent
    lineas = New String[]
    For Each linea In aret
        clinea = New String[]
        clinea.Add(IIf(TypeOf(linea[elemento]) = gb.String, linea[elemento], Right(String(12, "0") & CString(linea[elemento]), 12)), 0)
        For n = 0 To linea.count - 1
            clinea.Add(IIf(TypeOf(linea[n]) = gb.String, linea[n], CString(linea[n])))
        Next
        cad = clinea.Join("~")
        lineas.Add(cad)    
    Next
    lineas.Sort(modo)
    For i = 0 To lineas.count - 1
        linea = Split(lineas[i], "~")
        linea.extract(0)
        For n = 0 To linea.count - 1
           aRet[i][n] = IIf(TypeOf(aRet[i][n]) = gb.String, linea[n], Val(linea[n]))
        Next
    Next
    Return aRet
        
End
 


Como veis el sistema es el mismo, tan sólo que si el elemento a ordenar es numérico, se convierte a una cadena de 12 caracteres cuadrada con ceros a la izquierda, para que la ordenación sea válida como número.
Sigue siendo una chapuza... pero funciona.
 



 
última edición por shordi el Miercoles, 03 Abril 2013, 19:42; editado 1 vez 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Cadena A Matriz [SOLUCIONADO] skhaliburg General 3 Sabado, 25 Septiembre 2010, 19:06 Ver último mensaje
jsbsan
No hay nuevos mensajes Matriz, Array, Structure?¿?¿? No Sé Lo ... razaAztk General 9 Lunes, 14 Marzo 2011, 09:33 Ver último mensaje
shordi
No hay nuevos mensajes El Ejemplo Definitivo De Matriz, Array, Ar... tincho Aplicaciones/Fragmentos de Código 7 Martes, 10 Enero 2017, 19:47 Ver último mensaje
tincho
No hay nuevos mensajes Como Ordenar Un Array De Objetos De Difere... tercoIDE General 1 Martes, 21 Abril 2020, 23:02 Ver último mensaje
tercoIDE
 

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

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados
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
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron