Ordinare gli elementi di un vettore di Strutture in base ad un loro medesimo membro
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