Comunidad Gambas-es
[SOLUCIONADO] Ordenar una coleccion de acuerdo a los valores. - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Aplicaciones/Fragmentos de Código (https://gambas-es.org/forum-8.html)
+--- Tema: [SOLUCIONADO] Ordenar una coleccion de acuerdo a los valores. (/thread-1286.html)



Ordenar una coleccion de acuerdo a los valores. - tincho - 16-03-2023

Hola amigos.
Alguien sabría decir si existe una manera de ordenar una colección de acuerdo a sus valores, por ejemplo:

["perro"]=-3
["elefante"]=-2
["gato"]=1
["loro"]=-4
["hipopótamo"]=-2

La idea es ordenar de acuerdo el numero por ejemplo que quede así:

["loro"]=-4
["perro"]=-3
["elefante"]=-2
["hipopótamo"]=-2
["gato"]=1


RE: Ordenar una coleccion de acuerdo a los valores. - vuott - 17-03-2023

Una vez escribiste este tema. No sé si te servirá de algo.

https://gambas-es.org/showthread.php?tid=1011


RE: Ordenar una coleccion de acuerdo a los valores. - tincho - 17-03-2023

(17-03-2023, 03:04)vuott escribió: Una vez escribiste este tema. No sé si te servirá de algo.

Gracias Vuott, había olvidado que escribí sobre este tema, pero de momento me sirve.


RE: Ordenar una coleccion de acuerdo a los valores. - Shell - 18-03-2023

De la que hiciste, la transformé en dos.

Código:
Public Function CSortKey(c As Collection) As Collection
  ''Ordenar por la clave

  Dim aTmp As New String[]
  Dim cTemp As New Collection
  Dim sText As String
 
  For Each sText In c
    aTmp.Add(c.Key & "\t" & sText)
  Next
 
  aTmp.Sort(gb.Ascent)
 
  For Each sText In aTmp
    cTemp[Split(sText, "\t")[0]] = Split(sText, "\t")[1]
  Next
 
  Return cTemp
 
End

Public Function CSortValue(c As Collection) As Collection
  ''Ordenar por el valor      

  Dim aTmp As New String[]      
  Dim cTemp As New Collection
  Dim sText As String
 
  For Each sText In c
    aTmp.Add(sText & "\t" & c.Key)
  Next
 
  aTmp.Sort(gb.Ascent + gb.Language + gb.IgnoreCase)
 
  For Each sText In aTmp
    cTemp[Split(sText, "\t")[1]] = Split(sText, "\t")[0]
  Next
 
  Return cTemp
 
End

Supongo que según donde lo apliques, ordenar una colección tiene su interés.
Como su búsqueda es por la clave, siempre será más rápido que un array.

Pero desde luego tienes un problema, que no se pueden repetir las claves.

Saludos


RE: Ordenar una coleccion de acuerdo a los valores. - Shordi - 18-03-2023

Cita:Como su búsqueda es por la clave, siempre será más rápido que un array.
En mi experiencia no. Los arrays son más rápidos siempre.


Saludos


RE: Ordenar una coleccion de acuerdo a los valores. - Shell - 18-03-2023

(18-03-2023, 15:10)Shordi escribió: En mi experiencia no. Los arrays son más rápidos siempre.

Seria interesante ver un buen ejemplo. Wink
Supongo que necesitaríamos una cantidad de datos razonables.

Tomado de un articulo que encontré de Java ( que probablemente guarda una similitud). Se compara los arrays con las colecciones.
Habla de arrays estáticos, que tienen un tamaño definido, lo contrarío que las colecciones que son dinámicas.

En Java existe otro tipo de arrays que no son estáticos.

En cuanto a rendimiento:
 
Cita:Las operaciones de recuperación y asignación en una array toman un tiempo constante. Sin embargo, una array no admite la operación de inserción
ya que su longitud se fija después de la creación.

Todas las Colecciones en Java facilitan las operaciones de recuperación, asignación e inserción. El tiempo que toman estas operaciones depende de
la estructura de datos subyacente. Pero sin duda, las arrays ofrecen un mejor rendimiento que las colecciones.

En cuanto a los tipos que almacena:
 
Cita: 
Las arrays en Java pueden contener tipos de datos primitivos (int, char, long, float, double, boolean, etc.) y objetos Java (Integer, Character, Long, Float, Double, Boolean, String, etc.). Por el contrario, una colección puede contener elementos primitivos. Wrapper clases y objetos.

En cuanto al almacenamiento:
 
Cita: 
Los arrays toman O(n) espacio para n número de elementos y no reservar ningún almacenamiento adicional. Por el contrario, la mayoría de las Colecciones reservan algo de almacenamiento adicional para nuevos elementos, y el espacio real que ocupan los contenidos depende de la implementación.

En cuanto a las dimensiones:
 
Cita: 
La dimensión de una arrays es el número total de índices necesarios para seleccionar un elemento. Las arrays en Java admiten arrays unidimensionales y multidimensionales, mientras que una colección no tiene concepto de dimensiones. Sin embargo, podemos crear fácilmente Colecciones anidadas.

Probablemente encontremos ejemplos en un lenguaje más similar a Gambas como es Visual Basic que se pueda comprobar este tema.

 En cuanto a que sea más rápido te refieres a los array estáticos, no los dinámicos, supongo.
 Ya sabes lo malo que tiene el estático, que tienes que saber las dimensiones de antemano.

Saludos