Differenze tra le versioni di "Ordinare gli elementi di un vettore di Strutture in base ad un loro medesimo membro"

Da Gambas-it.org - Wikipedia.
 
Riga 24: Riga 24:
 
   End With
 
   End With
 
   sstt.Add(st1)
 
   sstt.Add(st1)
 
+
 
   With st2
 
   With st2
 
     .a = 5
 
     .a = 5

Versione attuale delle 04:17, 8 giu 2024

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