Array multidimensionali con numero indeterminato di elementi

Da Gambas-it.org - Wikipedia.

In Gambas vi sono anche Array (vettori) che non hanno un numero determinato degli elementi appartenenti alle loro dimensioni.

Dichiarazione di un array multidimensionale di numero non definito di elementi

L'array a numero non-determinato di elementi può definire due o più livelli di array.
Il primo livello è costituito da due o più array monodimensionali;
Il secondo livello contiene due o più array monodimensionali, ossia array di primo livello;
Il terzo livello contiene due o più array di secondo livello, ossia array di array;
e così via.

Così, ad esempio, in un array a due dimensioni la prima dimensione è costituita da due o più array monodimensionali contenenti i dati previsti dal tipo; la seconda dimensione contiene la predetta prima dimensione, ossia due o più elementi rappresentati dagli array monodimensionali.

Un array a due dimensioni di numero non definito di elementi, si dichiara a seconda dei casi o con istanziazione esplicita (esempio di Array di tipo Stringa contenente Array di tipo Stringa):

Dim arrArr As New String[][]   [nota 1]

oppure con istanziazione implicita (senza l'uso della parola-chiave NEW):

Dim arrArr As String[][]

Istanziazione implicita con inizializzazione esplicita

La istanziazione implicita - con inizializzazione esplicita - di un array di numero non definito di elementi sarà effettuata così:

arrArr = [["a", "b"], ["c", "d"], ["e", "f"]]

Verificando, quindi, la quantità di elementi (che contengono array) presenti nel caso precedente all'interno della variabile array, si avrà il risultato di: 3

Public Sub Main()

 Dim arrArr As String[][]

 arrArr = [["a", "b"], ["c", "d"], ["e", "f"]]

 Print arrArr.Count

End

Per sapere la quantità di elementi contenuti in un elemento array della variabile array, è necessaria l'istanziazione esplicita dell'array mediante la parola-chiave New:

 Public Sub Main()

 Dim arrArr As New String[][]

 arrArr = [["a", "b"], ["c", "d"], ["e", "f"]]

' Vogliamo sapere la quantità di elementi presenti nel 2° elemento (che è un array) della variabile array bidimensionale:
 Print arrArr[1].Count

End

Il risultato sarà: 2.

Vedere il contenuto di ciascun elemento

Per vedere il contenuto di ciascun elemento:

Public Sub Main()

 Dim arrArr As String[][] = [["a", "b"], ["c", "d"], ["e", "f"]]
 Dim b As Byte

 For b = 0 To arrArr[0].Max
   Print arrArr[0][b], arrArr[1][b], arrArr[2][b]
 Next

End

Eliminare un elemento di una dimensione

Per eliminare un elemento di una dimensione dell'array:

Public Sub Main()

 Dim arr As Integer[][]

 arr = [[11, 111], [22, 222], [33, 333], [44, 444]]
 Print arr.Count

' Viene eliminato interamente il 1° elemento della seconda dimensione (cioè l'array [11, 111]):
 arr.Remove(0, 1)
 Print arr.Count, arr[0][0]

 Print arr[2].Count, arr[2][1]

' Viene eliminato il 2° elemento del corrente 3° elemento della seconda dimensione (cioè il valore 444):
 arr[2].Remove(1, 1)
 Print arr[2].Count
' Qui verrà sollevato un errore, perché è stato rimosso il 2° elemento di quello che era diventato il 3° elemento della seconda dimensione:
 Print arr[2][1]

End

Rappresentazione delle dimensioni di un array multidimensionale di numero non definito di elementi

Va dunque precisato che durante l'uso di una variabile di tipo array, nella rappresentazione

variabile[n][n]

il numero presente nelle prime parentesi quadre di variabile[][] individua l'elemento della seconda dimensione della variabile[][]. Il numero, invece, presente nelle altre due parentesi quadre di variabile[][] individua l'elemento della prima dimensione, ossia l'elemento dell'elemento della seconda dimensione.

Pertanto, se abbiamo una variabile[][] (bidimensionale) così istanziata:

variabile[][] = [[11, 22, 33], [77, 88, 99]]

ponendo:

Print variabile[1][2]

con [1] è individuato il secondo elemento della seconda dimensione, mentre con [2] è individuato il terzo elemento della prima dimensione (il predetto secondo elemento della seconda dimensione), ossia il valore 99:

[[11, 22, 33], [77, 88, 99]]

Aggiungere elementi dinamicamente ad un array multidimensionale

Se l'array bidimensionale non ha un numero definito dei suoi elementi, esso è un vettore dinamico, ed è possibile aggiungere suoi elementi come segue:

Public Sub Main()

 Dim bb As New Byte[][]

' Viene aggiunto un elemento (indice 0) alla seconda dimensione, nonché il 1° elemento con relativo valore al predetto nuovo elemento della seconda dimensione:
 bb.Push([1])
 Print bb[0][0]
  
' Viene aggiunto un altro elemento (indice 1) alla seconda dimensione, nonché il 1° elemento con relativo valore al predetto nuovo elemento della seconda dimensione:
 bb.Push([2])
 Print bb[1][0]
 
' Viene aggiunto un altro elemento (indice 2) alla seconda dimensione, nonché il 1° e il 2° elemento con relativi valori al predetto nuovo elemento della seconda dimensione:
 bb.Push([3, 33])
 Print bb[2][0], bb[2][1]

End

Si sarà dunque costruito il seguente vettore bidimensionale:

[ [1], [2], [3, 33] ]

Come si nota, la seconda dimensione dell'array (quella compresa tra le parentesi quadre rosse) contiene tre elementi (ciascuno compreso da parentesi quadre blu), i quali - rappresentando la prima dimensione - contengono uno o due elementi.

Oppure:

Public Sub Main()

 Dim bb As New Byte[][]
     
' Viene aggiunto il 1° elemento della seconda dimensione:
 bb.Push([])
  
' Vengono aggiunti degli elementi al nuovo 1° elemento (prima dimensione) della seconda dimensione:
 bb[0].Push(10)
 bb[0].Push(11)
  
 Print bb[0][0]
 Print bb[0][1]
  
' Viene aggiunta un ulteriore elemento alla seconda dimensione:
 bb.Push([])
  
' Vengono aggiunti degli elementi al nuovo 2° elemento (prima dimensione) della seconda dimensione:
 bb[1].Push(20)
 bb[1].Push(21)
 
 Print bb[1][0]
 Print bb[1][1]
  
End

altro esempio:

Public Sub Main()

 Dim bb As New Byte[][]
 Dim a, b As Byte
 
 For a = 0 To 3
' Crea un elemento (ovviamente di tipo array) nella seconda dimensione, ossia crea la prima dimensione deputata a contenere i dati numerici.
   bb.Push([])
   For b = 0 To 5
' Inserisce i valori nell'array della prima dimensione appena sopra creata:
     bb[a].Push(b + a)
   Next
 Next

' Verifica:
 For a = 0 To 3
   For b = 0 To 5
     Print bb[a][b]
   Next
   Print
 Next
  
End

Aggiungere dinamicamente variabili vettoriali ad un Array multidimensionale

Conseguentemente ed ovviamente tali array multidimensionali possono contenere nei loro elementi variabili array monodimensionali.

Esempio:

Public Sub Main()

 Dim ss As New String[][]
 Dim s1, s2 As New String[]
 
' Assegna dei valori alle due variabili array che saranno contenute nella variabile array principale:
 s1 = ["a", "b"]
 s2 = ["c", "d", "e"]
 
' Assegnamo le due precedenti variabili array alla variabile array principale:
 ss = [s1, s2]

' Andiamo a vedere la quantità di elementi contenuti dalla variabile array principale, nonché da ciascuna variabile array individuandole all'interno della variabile array principale:
 Print ss.Count, ss[0].Count, ss[1].Count

End

ovviamente anche così:

Public Sub Main()

 Dim bb As New Byte[][]

 bb.Push([0, 1])   ' Inserisce il primo array. Quindi ora bb = [0,1]
 Print bb[0][0]
 Print bb[0][1]
 bb[0].Push(2)     ' Inserisce un valore nel primo array. Ora bb = [0,1,2]
 Print bb[0][2]
 Print
 bb.Push([10, 11]) ' Inserisce un secondo array. Ora bb = [[0,1,2], [10,11]]
 Print bb[1][0]
 Print bb[1][1]
 bb[1].Push(12)   ' Inserisce un valore nel secondo array. Ora bb = [[0,1,2], [10,11.12]]
 Print bb[1][2]

' Andiamo a vedere la quantità di elementi contenuti dalla variabile array principale, nonché da ciascuna variabile array individuandole all'interno della variabile array principale:
 Print bb.Count, bb[0].Count, bb[1].Count

End

Vediamo anche quest'altro esempio:

Public Sub Main()
 
 Dim vettore As Byte[]
 Dim multi As New Byte[][]
 Dim b As Byte
  
 For b = 2 To 9 
' Crea un semplice vettore monodimensionale...
   vettore = New Byte[b]
' ...e lo aggiungiamo al array multidimensionale:
   multi.Push(vettore) 
 Next
 
 
' Assegna un valore ad un elemento di un vettore contenuto dall'array multidimensionale e verifichiamo in console:
 multi[7][5] = 24
  
 Print multi[7][5]

End

Array multidimensionale a tre dimensioni

Analogamente ai bidimensionali in un array a tre dimensioni la prima dimensione è l'array multidimensionale in quanto tale, destinata a contenere uno o più elementi di tipo array. Tali elementi rappresentano la seconda dimensione e sono destinati a contenere uno o più elementi di tipo array. Questi elementi rappresentano la terza e ultima dimensione e sono destinati, pertanto, a contenere i dati veri e propri previsti dal tipo.

Dunque una variabile array tridimensionale è un array contenente array che contengono a loro volta altri array (questi ultimi array invece contengono finalmente i valori da immagazzinare).

Tale variabile tridimensionale sarà così dichiarata (esempio con una variabile di tipo Stringa):

Dim arrArr As New String[][][]


Esempio:

Public Sub Main()

 Dim ss As New String[][][]

 ss = [[["a", "b"], ["c", "d"], ["e", "f"]], [["g", "h"], ["i", "l", "m", "n"], ["o", "p"]]]

' Vogliamo sapere la quantità di elementi (che sono array) presenti nella variabile array (il risultato sarà in questo caso "2"):
 Print ss.Count

' Vogliamo sapere la quantità di elementi (che sono array) presenti nel secondo elemento della variabile array (il risultato in questo caso sarà "3"):
 Print ss[1].Count

' Volendo scendere ancora di livello, per conoscere la quantità di elementi presenti nel secondo elemento del secondo elemento superiore della variabile array (il risultato in questo caso sarà "4"):
  
 Print ss[1][1].Count

End


Molteplici array di array

Ovviamente si potranno creare variabili array contenenti ulteriori e molteplici array di array al proprio interno.

Array che contiene insieme sia singoli valori che altri array

Per creare un vettore che contenga sia dei valori che altri vettori, è necessario usare il tipo di variabile Variant:

Public Sub Main()

 Dim v As Variant[] = [1, 2, 3, 4]

 v.Add([5, 6, 7])
   
 Print v[0]
 Print v[1]
 Print v[2]
 Print v[3]
 Print v[4][0]
 Print v[4][1]
 Print v[4][2]

 v.Add([8, 9, [10, 11, 12]])

 Print v[5][0]
 Print v[5][1]
 Print v[5][2][0]
 Print v[5][2][1]
 Print v[5][2][2]

End


Sostituire un valore in un elemento, contenente un singolo valore, con un array

E' possibile sostituire, ovviamente in un elemento un singolo valore con un array, e viceversa:

Public Sub Main()

 Dim v1, v2 As Variant[]

 v1 = [1, 2, 3, 4]
 v2 = [5, 6, 7]

 v1[2] = v2

 Print v1[0]
 Print v1[1]
 Print v1[2][0]
 Print v1[2][1]
 Print v1[2][2]
 Print v1[3]

End

Note

[1] Possiamo dire che:


  • nel vettore monodimensionale
Dim vettore As Integer[]

vengono contenuti valori non vettoriali:

vettore = [1, 2, 3, 4]


  • nel vettore bidimensionale
Dim vettore As Integer[][]

vengono contenuti uno o più vettori monodimensionali

vettore = [ [1, 2, 3, 4], [5, 6, 7, 8] ]


  • nel vettore tridimensionale
Dim vettore As Integer[][][]

vengono contenuti uno o più vettori bidimensionali

 vettore = [ [ [1, 2, 3, 4], [5, 6, 7, 8] ], [ [8, 7, 6, 5], [4, 3, 2, 1] ] ]

e così via con gli altri multidimensionali.