Programmation Visual Basic .NET/Tableaux

Tableaux à une dimension : les listes

modifier

Le type du tableau est imposé à tous ses éléments (un tableau Integer ne pourra stocker que des entiers). Voici un tableau de taille six (d'indice 0 à 5) :

 Dim NomTableau(5) As Integer

Cette déclaration engendre la création de cet objet :

Index Données
00 Nothing
01 Nothing
02 Nothing
03 Nothing
04 Nothing
05 Nothing

Que l'on peut parcourir ainsi : NomTableau(0), NomTableau(1),..., NomTableau(10).


Pour assigner des valeurs pendant la déclaration on crée une instance de la classe du type (ici Integer) :

 Module Module1
   Sub Main()
     Dim NomTableau() As Integer = New Integer(4) { 1, 2, 3, 4, 5 }

     ' Affichage du tableau déclaré
     For ligne = 0 To UBound(NomTableau)
       Console.WriteLine(NomTableau(ligne))
     Next
     Console.ReadLine()
   End Sub
 End Module

Voici un autre exemple avec une instance de String dont les valeurs sont attribuées ensuite :

     Dim NomTableau As System.Array
     NomTableau = System.Array.CreateInstance(GetType(String), 4)
     NomTableau(0) = "a"
     NomTableau(1) = "b"
     NomTableau(2) = "c"
     NomTableau(3) = "d"

     ' Affichage du tableau déclaré
     For ligne = 0 To NomTableau.Length
       Console.WriteLine(NomTableau(ligne))
     Next
     Console.ReadLine()

Pour afficher tous les éléments du tableau d'un coup on utilise un énumérateur :

       Dim En As System.Collections.IEnumerator
       Dim NomTableau As System.Array
       NomTableau = System.Array.CreateInstance(GetType(String), 4)
       NomTableau(0) = "a"
       NomTableau(1) = "d"
       NomTableau(2) = "b"
       NomTableau(3) = "c"

       ' Affichage du tableau déclaré
       En = NomTableau.GetEnumerator
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop

       Console.WriteLine("Presser entrée pour continuer...")
       Console.ReadLine()

Classer le tableau :

       Dim NomTableau As System.Array
       Dim En As System.Collections.IEnumerator
       NomTableau = System.Array.CreateInstance(GetType(String), 4)

       NomTableau(0) = "a"
       NomTableau(1) = "d"
       NomTableau(2) = "b"
       NomTableau(3) = "c"
       En = NomTableau.GetEnumerator
       Console.WriteLine("Avant classement")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Sort(NomTableau)
       En = NomTableau.GetEnumerator
       Console.WriteLine("Après classement")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop

       Console.WriteLine("Presser entrée pour continuer...")
       Console.ReadLine()

Classer le tableau par ordre décroissant :

 Module Module1
   Sub Main()
       Dim NomTableau As System.Array
       Dim En As System.Collections.IEnumerator
       Dim DescSortCompare = New DescSortCompareClass
       NomTableau = System.Array.CreateInstance(GetType(String), 4)

       NomTableau(0) = "a"
       NomTableau(1) = "d"
       NomTableau(2) = "b"
       NomTableau(3) = "c"
       En = NomTableau.GetEnumerator
       Console.WriteLine("Avant classement décroissant")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Sort(NomTableau, DescSortCompare)
       En = NomTableau.GetEnumerator
       Console.WriteLine("Après classement décroissant")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop

       Console.WriteLine("Presser entrée pour continuer...")
       Console.ReadLine()
   End Sub


   Public Class DescSortCompareClass
       Implements IComparer

       Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
           Return x > y
       End Function
   End Class
 End Module

Renverser le tableau :

       Dim NomTableau As System.Array
       Dim En As System.Collections.IEnumerator
       NomTableau = System.Array.CreateInstance(GetType(String), 4)

       NomTableau(0) = "a"
       NomTableau(1) = "d"
       NomTableau(2) = "b"
       NomTableau(3) = "c"
       En = NomTableau.GetEnumerator
       Console.WriteLine("Avant renversement du tableau")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Reverse(NomTableau)
       En = NomTableau.GetEnumerator
       Console.WriteLine("Après renversement du tableau")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop

       Console.WriteLine("Presser entrée pour continuer...")
       Console.ReadLine()

Une autre façon de classer de façon décroissante est de renverser le tableau croissant :

       Dim NomTableau As System.Array
       Dim En As System.Collections.IEnumerator
       NomTableau = System.Array.CreateInstance(GetType(String), 4)

       NomTableau(0) = "a"
       NomTableau(1) = "d"
       NomTableau(2) = "b"
       NomTableau(3) = "c"

       En = NomTableau.GetEnumerator
       Console.WriteLine("Avant classement décroissant")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop
       Array.Sort(NomTableau)
       Array.Reverse(NomTableau)
       En = NomTableau.GetEnumerator
       Console.WriteLine("Après classement décroissant")
       Do While En.MoveNext
           Console.WriteLine(En.Current())
       Loop

       Console.WriteLine("Presser entrée pour continuer...")
       Console.ReadLine()

La ligne Option Strict On impose d'utiliser SetValue pour affecter des valeurs aux tableaux :

 Option Strict On
 Module Module1
   Sub Main()
       Dim NomTableau As System.Array
       Dim En As System.Collections.IEnumerator
       NomTableau = System.Array.CreateInstance(GetType(String), 4)

       NomTableau.SetValue("a", 0)
       NomTableau.SetValue("d", 1)
       NomTableau.SetValue("b", 2)
       NomTableau.SetValue("c", 3)

       For ligne = 0 To NomTableau.Length - 1
          Console.WriteLine(NomTableau(ligne))
       Next
       Console.ReadLine()
   End Sub
 End Module

Tableaux à plusieurs dimensions

modifier

On peut déclarer des tableaux 2D, 3D, 4D etc.

 ' Tableau 2D aux coordonnées (X, Y)
 Dim NomTableau2D(2, 2) As Integer

Cela génère cet objet :

Index Data
0, 0 Nothing
0, 1 Nothing
0, 2 Nothing
1, 0 Nothing
1, 1 Nothing
1, 2 Nothing
2, 0 Nothing
2, 1 Nothing
2, 2 Nothing

Pour le parcourir on peut utiliser des boucles imbriquées, ou bien un énumérateur :

        Dim En As System.Collections.IEnumerator
        Dim NomTableau2D(2, 1) As String
        NomTableau2D(2, 0) = "3"
        NomTableau2D(2, 1) = "c"
        NomTableau2D(1, 0) = "2"
        NomTableau2D(1, 1) = "b"
        NomTableau2D(0, 0) = "1"
        NomTableau2D(0, 1) = "a"

        ' Affichage du tableau déclaré
        En = NomTableau2D.GetEnumerator
        Do While En.MoveNext
            Console.WriteLine(En.Current())
        Loop

        Console.WriteLine("Presser entrée pour continuer...")
        Console.ReadLine()

Le résultat sera :

1
a
2
b
3
c
Presser entrée pour continuer...

Méthodes de manipulation de tableaux

modifier
  • Split() : pour transformer une chaine de caractères en tableau, selon le séparateur placé en paramètre.
  • Join() : convertit un tableau en chaine.
  • Filter() : filtre les entrées d'un tableau.

Exemple :

 Module Module1
   Sub Main()
     Dim NomTableau() As String = Split("lorem ipsum dolor sit", " ")
     Console.WriteLine(NomTableau(1))  ' affiche "ipsum"

     NomTableau(4) = "amet"
     Dim ContenuTableau As String = String.Join(" ", NomTableau)
     Console.WriteLine(ContenuTableau)

     Dim SousTableau = Filter(NomTableau, "o", True, CompareMethod.Text)
     Console.WriteLine(String.Join(" ", SousTableau))  ' affiche les mots contenant des "o"

     Console.ReadLine()
   End Sub
 End Module

Voir aussi

modifier