Array multidimensionali con numero indeterminato di elementi

Da Gambas-it.org - Wikipedia.

In Gambas vi sono [[Array_multidimensionali_statici|Array (vettori) che non hanno un numero determinato degli elementi costituenti le loro dimensioni, e Array (vettori), ai quali viene in sede di definizione specificato il numero dei propri elementi costitutivi delle loro dimensioni.

Entrambi i tipi di array (vettori) multidimensionali contengono nelle loro dimensioni altri array.

Un array a due dimensioni di elementi non definiti, si dichiara nel modo seguente (esempio di Array di tipo Stringa contenente Array di tipo Stringa):

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

e la sua istanziazione implicita - con inizializzazione esplicita - 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.


Per vedere il contenuto di ciascun elemento:

Public Sub Main()

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

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

End


Per eliminare ad esempio un elemento dall'interno di una dimensione dell'array:

Public Sub Main()

 Dim arrArr As String[][]
 
  arrArr = [["a", "b"], ["c", "d"], ["e", "f"]["g", "h"]]
   
  Print arrArr.Count
   
  Print arrArr[2].Count
   
  arrArr[2].Remove(0)

  Print arrArr[2].Count

End


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

variabile[n][n]

il numero presente nelle prime parentesi quadre di variabile[][] individua l'elemento della prima dimensione della variabile[][], ossia individua un vettore contenuto nella stessa variabile[][]. Il numero, invece, presente nelle altre due parentesi quadre di variabile[][] individua l'elemento dell'elemento, cioè della seconda dimensione, contenuto da variabile[][].

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 prima dimensione, mentre con [2] è individuato il terzo elemento del predetto secondo elemento della prima dimensione, ossia:

[[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 alla seconda dimensione, nonché il primo elemento al predetto nuovo elemento della seconda dimensione:
  bb.Push([1])
  Print bb[0][0]
  
' Viene aggiunto un altro elemento alla seconda dimensione, nonché il primo elemento al predetto nuovo elemento della seconda dimensione:
  bb.Push([2])
  Print bb[1][0]

End  


oppure:

Public Sub Main()

 Dim bb As New Byte[][]
     
' Viene creata la prima dimensione:
  bb.Push([])
  
' Vengono aggiunti degli elementi alla prima dimensione:
  bb[0].Push(10)
  bb[0].Push(11)
  
  Print bb[0][0]
  Print bb[0][1]
  
' Viene aggiunta un'ulteriore dimensione:
  bb.Push([])
  
' Vengono aggiunti degli elementi alla nuova seconda dimensione:
  bb[1].Push(20)
  bb[1].Push(21)
  
  Print bb[1][0]
  Print bb[1][1]
  
End


oppure:

Public Sub Main()

 Dim bb As New Byte[][]
     
' Viene creata la prima dimensione, ed aggiunti due elementi ed i rispettivi valori:
  bb.Push([1, 10])
  
' Viene aggiunta una seconda dimensione, ed aggiunti due elementi ed i rispettivi valori:
  bb.Push([2, 20])
  
   Print bb[0][0]
   Print bb[0][1]
   Print bb[1][0]
   Print bb[1][1]

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[]
 

' Assegnamo dei valori ale 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

oppure più dinamicamente:

Public Sub Main()

 Dim ss As New String[][]
 Dim s1, s2 As New String[]
 

' Assegnamo dei valori ale 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.Push(s1)
  ss.Push(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


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
  
' Creiamo un semplice vettore monodimensionale...
    vettore = New Byte[b]
  
' ...e lo aggiungiamo al array multidimensionale:
    multi.Push(vettore)
    
  Next
   
' Assegnamo 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

Potremo anche creare ed utilizzare una variabile array tridimensionali (un array contenente array che contengono a loro volta altri array).

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

Dim arrArr As 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] Potremmo immaginare ogni gruppo di parantesi quadre [] come un livello vettoriale.

Nel vettore di primo livello

Dim vettore As Integer[]

vengono contenuti i valori veri e propri del vettore:

vettore = [1, 2, 3, 4]


Nel vettore di secondo livello

Dim vettore As Integer[][]

vengono contenuti due o più vettori di primo livello

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


Nel vettore di terzo livello

Dim vettore As Integer[][][]

vengono contenuti due o più vettori di secondo livello

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

e così via con gli altri livelli.