Ordinare gli elementi di un vettore di Strutture in base ad un loro medesimo membro

Da Gambas-it.org - Wikipedia.

Il caso è quello in cui, dopo aver assegnato ad un vettore di tipo Struttura due o più variabili del tipo di quella Struttura, si procede ad effettuare un ordinamento all'interno di quel vettore sulla base di un medesimo membro delle predette variabili di tipo Struttura assegnate agli elementi del vettore.


Mostriamo di seguito un possibile codice, nel quale si procederà successivamente all'ordinamento in modalità discendente in base al primo membro della Struttura modello, che risulta essere di tipo Byte.
L'ordinamento, in vero, in questo codice non consiste in una riorganizzazione degli elementi originari del vettore di tipo Struttura, ma avviene in modo indiretto assegnando ad un nuovo vettore del tipo della Struttura utilizzata le variabili di tipo Struttura originarie, dopo aver individuato in modo discendente di ciascuna il rispettivo valore del primo membro:

Public Struct STRUTTURA
  a As Byte
  b As String
End Struct


Public Sub Main()

 Dim st1, st2, st3 As New STRUTTURA
 Dim sstt As New STRUTTURA[]
 Dim nova As New STRUTTURA[3]
 Dim j, k As Byte
 Dim bb As New Byte[3]
 
' Vengono assegnati i valori a ciascuna variabile di tipo della Struttura "STRUTTURA",
' si assegna ogni variabile ad un elemento del vettore di tipo della Struttura "STRUTTURA":
  With st1
    .a = 0
    .b = "st1"
  End With
  sstt.Add(st1)

  With st2
    .a = 5
    .b = "st2"
  End With
  sstt.Add(st2)

  With st3
    .a = 3
    .b = "st3"
  End With
  sstt.Add(st3)

' Passa il valore del membro oggetto dell'ordinamento ad un vettore di tipo omogeneo:
   For j = 0 To sstt.Max
     bb[j] = sstt[j].a
   Next
   
' Effettua l'ordinamento (in questo caso di tipo "discendente"):
   bb.Sort(gb.Descent)
   
' Genera un vettore di tipo della Struttura "ST" contenente nei propri elementi le variabili del tipo Struttura "ST" "ordinati" in base al membro ".a":
   For j = 0 To bb.Max
     For k = 0 To sstt.Max
       If bb[j] = sstt[k].a Then
         With nova[j] = New STRUTTURA
           .a = sstt[k].a
           .b = sstt[k].b
         End With
       Endif
     Next
   Next
   

' Verifica del risultato:
   For j = 0 To nova.Max
     With nova[j]
       Print .a
       Print .b
     End With
     Print
   Next
       
End


Mostriamo un altro esempio analogo, nel quale l'ordine dei nomi sarà adattato secondo l'ordine dei punteggi, corrispondente al membro di tipo Byte della Struttura:

Public Struct STRUTTURA
  nome As String
  punt As Byte
End Struct


Public Sub Main()
 
 Dim ri As STRUTTURA
 Dim rrii As New STRUTTURA[]
 Dim nuova As New STRUTTURA[4]
 Dim nomi As String[]
 Dim punteggi, bb As Byte[]
 Dim b, c As Byte
   
  nomi = ["Aaaa", "Bbbb", "Cccc", "Dddd"]
  punteggi = [15, 32, 18, 50]
  For b = 0 To nomi.Max
    ri = New STRUTTURA
    ri.nome = nomi[b]
    ri.punt = punteggi[b]
    rrii.Push(ri)
  Next
  
  With bb = New Byte[]
    For b = 0 To rrii.Max
      .Push(rrii[b].punt)
    Next
    .Sort(gb.Descent)
  End With
  
  For b = 0 To bb.Max
    For c = 0 To rrii.Max
      If bb[b] = rrii[c].punt Then
        With nuova[b] = New STRUTTURA
          .nome = rrii[c].nome
          .punt = rrii[c].punt
        End With
      Endif
    Next
  Next
  
  For b = 0 To nuova.Max
    Print nuova[b].punt, nuova[b].nome
  Next
  
End