Array multidimensionali con numero indeterminato di elementi

Da Gambas-it.org - Wikipedia.

In Gambas vi sono 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.


Dichiarazione di un array multidimensionale di numero non definito di elementi

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

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

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.


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


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, la rappresentazione

variabile[n][n]

il numero presente nelle prime parentesi quadre di variabile[][] individua l'elemento della prima dimensione della variabile[][]. Il numero, invece, presente nelle altre due parentesi quadre di variabile[][] individua l'elemento dell'elemento della prima 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 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 1° 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 1° elemento al predetto nuovo elemento della seconda dimensione:
 bb.Push([2])
 Print bb[1][0]
 
' Viene aggiunto un altro elemento alla seconda dimensione, nonché il 1° e il 2° elemento al predetto nuovo elemento della seconda dimensione:
 bb.Push([3, 33])
 Print bb[2][0], bb[2][1]

End  


oppure:

Public Sub Main()

 Dim bb As New Byte[][]
     
' Viene aggiunto il 1° elemento della prima dimensione:
  bb.Push([])
  
' Vengono aggiunti degli elementi al nuovo 1° elemento della prima dimensione:
  bb[0].Push(10)
  bb[0].Push(11)
  
  Print bb[0][0]
  Print bb[0][1]
  
' Viene aggiunta un ulteriore elemento alla prima dimensione:
  bb.Push([])
  
' Vengono aggiunti degli elementi al nuovo 2° elemento della prima dimensione:
  bb[1].Push(20)
  bb[1].Push(21)
  
  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] 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 due o più vettori monodimensionali

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


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

vengono contenuti due o più vettori bidimensionali

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


e così via con gli altri multidimensionali.