Autore Topic: Ordinare una matrice bidimensionale  (Letto 801 volte)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Ordinare una matrice bidimensionale
« il: 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
« Ultima modifica: 22 Novembre 2021, 15:58:13 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #1 il: 22 Novembre 2021, 16:06:01 »
Un array bidimensionale [90,1] non ha molto senso...  :-X
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #2 il: 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...  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #3 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #4 il: 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
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #5 il: 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".
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #6 il: 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.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #7 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #8 il: 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.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #9 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #10 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.243
  • Tonno verde
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #11 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline alejandro

  • Gamberetto
  • *
  • Post: 21
    • Mostra profilo
Re:Ordinare una matrice bidimensionale
« Risposta #12 il: 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