Gambas-it

Gambas3 => Programmazione => Topic aperto da: Gianluigi - 22 Novembre 2021, 15:56:02

Titolo: Ordinare una matrice bidimensionale
Inserito da: Gianluigi - 22 Novembre 2021, 15:56:02
Alejandro chiede :

Ottenuta una matrice Numero as new integer[90,1],come si fa ad mettere ordine decrescente non per il primo vettore della matrice bensi per il secondo?
Codice: [Seleziona]
' input
1   140
2   2
3   200

' output
3   200
1   140
2   2
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: vuott - 22 Novembre 2021, 16:06:01
Un array bidimensionale [90,1] non ha molto senso...  :-X
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: Gianluigi - 22 Novembre 2021, 16:12:42
Un array bidimensionale [90,1] non ha molto senso...  :-X

Hai ragione, ma credo si tratti di un refuso: penso che dovresti basarti sull'esempio a seguire...  :-\
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: vuott - 22 Novembre 2021, 17:10:45
Potrebbe essere:

Codice: [Seleziona]
Public Sub Main()

 Dim ii As New Integer[2, 2]
 
 ii[0, 0] = 5
 ii[0, 1] = 3
 ii[1, 0] = 6
 ii[1, 1] = 4
 
 ii = ii.Sort(gb.Descent)
 
 Print ii[0, 0]
 Print ii[0, 1]
 Print ii[1, 0]
 Print ii[1, 1]

End
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: Gianluigi - 22 Novembre 2021, 17:19:36
 :-X

Codice: [Seleziona]
Public Sub Main()

  Dim aNumeri As New Integer[3, 2]

  aNumeri[0, 0] = 1
  aNumeri[1, 0] = 2
  aNumeri[2, 0] = 3
  aNumeri[0, 1] = 140
  aNumeri[1, 1] = 2
  aNumeri[2, 1] = 200
 
  For r As Byte = 0 To 2
    For c As Byte = 0 To 1
      Print aNumeri[r, c];;
    Next
    Print
  Next
 Print "\nSort by vuott\n"
  '' Orrore e raccapriccio :-P
  aNumeri.Sort(gb.Descent)
 
  For r As Byte = 0 To 2
    For c As Byte = 0 To 1
      Print aNumeri[r, c];;
    Next
    Print
  Next

End

 ;D
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: vuott - 22 Novembre 2021, 17:34:46
Il mio codice riordina tutti i valori dell'array come fosse ad una dimensione.
Mi fai capire che lui invece vuole riordinare "per e all'interno di ciascuna dimensione".
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: vuott - 22 Novembre 2021, 18:04:39
...riordinare "per e all'interno di ciascuna dimensione".

...credo che lui debba usare gli Array multidimensionali con numero indeterminato di elementi.
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: Gianluigi - 22 Novembre 2021, 18:12:19
...riordinare "per e all'interno di ciascuna dimensione".

...credo che lui debba usare gli Array multidimensionali con numero indeterminato di elementi.

Scusami vuott mi ero assentato...

Si lui vuole poter ordinare l'array per colonna, la seconda (vedi la sua domanda iniziale imput e output).
Il fatto è che lui ha posto la domanda nella discussione di sqlite e più veloce che ordinare una tabella per colonna di quanto lo fa un database è impossibile per Gambas.
Pertanto se si sta usando un database la cosa migliore da fare è: Prima ordinare la tabella e poi esportarne i dati.

Ma se per qualche motivo non lo si può fare e occorre riordinare un Array allora, oltre al tuo suggerimento, (c'è anche un mio vecchio esempio nella Farm: DynamicMatrixExample) mi sento di suggerire il metodo _Compare qui c'è una classe che lo utilizza:
https://www.gambas-it.org/smf/index.php?topic=6369.msg43941#msg43941

Sono a disposizione per ulteriori eventuali approfondimenti sul tema.

 :ciao:
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: vuott - 22 Novembre 2021, 18:29:54
Il problema è che - almeno per le prove da me fatte - non esiste la possibilità di richiamare i Metodi tipici degli array da una specifica dimensione dell'array con numero di elementi definiti.  :-\
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: Gianluigi - 22 Novembre 2021, 23:37:49
Il problema è che - almeno per le prove da me fatte - non esiste la possibilità di richiamare i Metodi tipici degli array da una specifica dimensione dell'array con numero di elementi definiti.  :-\

Infatti, allego un modo usando una classe

 :ciao:
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: vuott - 23 Novembre 2021, 05:06:13
...potrebbe fare un percorso più lungo e usare alla vecchia maniera un paio di array monodimensionali d'appoggio:
Codice: [Seleziona]
Public Sub Main()

  Dim aNumeri As New Integer[3, 2]
  Dim n0, n1 As New Integer[3]

  aNumeri[0, 0] = 1
  aNumeri[1, 0] = 2
  aNumeri[2, 0] = 3
  aNumeri[0, 1] = 100
  aNumeri[1, 1] = 200
  aNumeri[2, 1] = 300
 
  For r As Byte = 0 To 2
    n0[r] = aNumeri[r, 0]
    n1[r] = aNumeri[r, 1]
  Next
 
  n0.Sort(gb.Descent)
  n1.Sort(gb.Descent)

  For r As Byte = 0 To 2
    aNumeri[r, 0] = n0[r]
    aNumeri[r, 1] = n1[r]
  Next

  Print

  For c As Byte = 0 To 1
    For r = 0 To 2
      Print aNumeri[r, c]
    Next
    Print
  Next

End
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: Gianluigi - 23 Novembre 2021, 09:39:51
...potrebbe fare un percorso più lungo e usare alla vecchia maniera un paio di array monodimensionali d'appoggio:
...

Si, si può fare benissimo, ma occorre tener conto che nell'esempio parliamo di pochissimi dati e qualunque soluzione risulta valida.
In un progetto reale che può crescere negli anni, queste soluzioni sono da evitare.
Tobias, che studia matematica all'università, ha cercato di spiegarmelo tirando in ballo nientepopodimenoché Gauss, purtroppo non sono stato in grado di capire il ragionamento ma il succo è questo: Gambas quando cicla le matrici crea copie di queste, il che potrebbe causare l'esaurimento della memoria ram.
Lo stesso Benoit, in varie occasioni, ha affermato che Gambas, nel trattare le matrici (che in Gambas sono delle classi), crea dietro le quinte delle nuove classi e pertanto il loro utilizzo risulta essere il metodo più veloce.

 :ciao:
Titolo: Re:Ordinare una matrice bidimensionale
Inserito da: alejandro - 26 Novembre 2021, 21:16:22
scusate,ma ero assente per lavoro......
rivedendo il quesito ho capito la cavolata che ho scritto.
basta una monodimensionale con la funzione sort.
grazie ragazzi  ;D