Jeux Libres
       
           

» Les Tutoriels » La programmation de jeux avec le langage Java » Les tableaux

Les tableaux


<!-- o mise en gras -->Ici, nous allons voir quelque chose d'important. Ce sont les tableaux. Je vais vous montrer comment trier les valeurs d'un tableau, comment copier les valeurs d'un tableau dans un autre, ... Plus tard vous verrez qu'on peut créer des tableaux d'objet, par exemple, des tableau d'objets de type chaînes de caractères et même les trier.
<!-- f mise en gras -->





Chapitre précédent     Sommaire     Chapitre suivant


Les tableaux à une dimension


C'est quoi un tableau ?


C'est un ensemble de variables regroupées les une à la suite des autres en mémoire, de tel sorte que l'on puisse stocker plusieurs éléments dans une seule et même variable qui sera le nom du tableau, et chaque variables dans le tableau sera récupéré grâce à sa position dans le tableau. (son indice.)
La récupération d'une variable dans un tableau de variables se fait grâce à l'opérateur crochet et on précise sa position dans le tableau entre les crochets.
Pour déclarer un tableau, on utilise aussi des crochets, le nombre de crochets varie selon la dimension du tableau.
Un tableau à toujours une taille fixe, et la position du première élément est toujours égal à zéro.
Un tableau peut avoir plusieurs dimensions..., on le verra.
On peut dire qu'un tableau est un objet conteneur qui permet de stocker d'autres objets.

Les vecteurs


Ce sont des tableaux spéciaux à une seule dimension, ils sont connus sous le nom de vecteurs.
Déclaration d'un tableau :
1
int[] iTab;
Donc, on indique le type du tableau suivit de sa dimension "[]" puis de son nom. (1 seul [] = 1 seule dimension.)
Un tableau est un objet, on devra le créer de la manière suivante :
1
iTab = new int[10];
On crée un tableau de 10 éléments en mémoire. Chaque élément est numéroté par un indice qui peut varier de 0 à la taille du tableau -1 puisqu'on commence l'indexation à partir de zéro.
Donc, la variable de type tableau contient l'adresse mémoire du première élément du tableau, et pour récupérer le ième élément du tableau, Java ajoute i à l'adresse mémoire du première élément du tableau.

Il faut par conséquent connaitre la taille du tableau, pour que java puisse chercher dans la mémoire de votre PC un emplacement ou il y a n adresses vides en mémoire si votre tableau fait n éléments.

Donc on a l'adresse du première élément + déplacement. (C'est ce que l'on appelle l'adresse relative du ième élément dans le tableau.)

Un schéma de la mémoire sera sans doute plus claire.


On a donc 500 qui est l'adresse du tableau, mais aussi l'adresse du première élément dans le tableau!
Ind correspond à l'indice c'est à dire la valeur qu'il faut ajouté à l'adresse du première élément pour obtenir le ième élément, et c'est avec cette valeur que l'on va travailler.

Cette valeur (Ind sur le dessin) doit être de type int et elle doit être  entière et positive!


[color=#dd000]Les variables ou objets sont donc ainsi indexés.[/color]

Comment initialiser un tableau.

On peut le faire de 2 façons : on l'initialise élément par élément.
1
iTab[0]=1; iTAb[1]=2; etc...

C'est assez lourd à écrire, alors on peut simplifier en écrivant :
1
iTab = {1, 2, 3, 4};

Rmq : tout les éléments non initialisés valent zéro.


Ne pas vous mettre en tête que les valeurs dans le tableau sont initialisées automatiquement lors de sa création! En effet, si vous créer un tableau d'objets, ceux-ci seront automatiquement initialisés à null (ce qui veut dire rien).
Il n'y aura aucune valeur pour ces objets dans la mémoire centrale, et si vous voulez les utiliser, vous aurez un message d'erreur lors de l'exécution vous disant que ces objets sont null!
Bah oui puisqu'ils sont crées mais qu'ils ne contiennent rien.


On peut aussi initialiser les tableaux à l'aide d'une boucle.
1
2
3
for (int i = 0; i < iTab.length; i++) { //iTab.length = la taille du tableau.
iTab[i] = valeur;
}

On peut créer ainsi tout type de tableaux : Individu[] candidats = new Individu[10];

On peut aussi regrouper déclaration, création et initialisation :
La taille du tableau sera alors égale au nombre d'éléments initialisés dans le tableau.
[code=java]
char[] tChar = new char[]{'A','B','C'};


//La taille du tableau sera ici de 3.
[/code]


Les tableaux multidimentionnels


Le java a une manière particulière de créer des tableaux multi-dimensionnels.


On peut déclarer des tableaux de n'importe quel type, mais aussi des tableaux de type tableau!
Un petit schéma :


On voit donc là que avec le crochet mauve, j'accède à l'élément dont l'indice vaut 1 de la première dimension du tableau.

Et ensuite, vous voyez j'ai mit la même couleur (rouge) pour le sous tableau et la case du tableau dans lequel se sont tableau à été créé, bah vous prenez l'élément de l'indice 1 du tableau rouge du dessous qui est indiqué par le crochet vert.

Les crochets permettent donc d'accéder à une dimension d'un tableau.
Si on met une valeur entre les crochets, ça accède à l'élément n°i du tableau. (ou du sous tableau)
Il faut donc jouer avec les crochets.


Les matrices



Ce sont des tableaux à deux dimensions.

Exemple de tableaux à deux dimensions connus sous le nom de matrices :
1
2
3
int iTab2 [][] = new int [3][];
iTab2[0] = new int [5]; //Création d'un sous tableau dans le première élément du tableau iTab2.
iTab2[1] = new int [5]; //....

La déclaration d'un tableaux à deux dimensions est donc :
1
int [][] iTab2;
La création :
1
iTab2 = new int [3][5];

Initialisation et affectation :

Encore de 2 manières possibles, soit avec deux boucles for imbriquées l'une dans l'autre, ou alors comme ceci :
1
int [][] iTab = {{1, 2, 3, 4},{5, 6, 7, 10},{11, 22}};

Il y a non plus un seul indice, mais 2 indices pour caractériser un élément d'un tableau : le numéro de sa ligne et celui de sa colonne.

Par exemple, pour récupérer l'élément de la ligne 1 et de la colonne 2 on devra écrire :
int element = iTab[1][2];


On peut bien sûr récupérer la longueur de ces tableaux; c'est le nombre de lignes ou de colonnes qu'ils possèdent.
1
2
int nbLignes = iTab.length; //Nombres de lignes. (=Taille du premier tableau)
int nbColonnes = iTab[].length; //Nombre de colonnes. (=Taille des sous tableaux contenu dans le premier)

On peut aussi initialiser un tel type de tableau avec deux boucles. Tableau à n dimension = n boucles. (imbriquées)
1
2
3
4
5
for (int i  = 0; i < 5; i++) {
         for (int j = 0; j < 5; j++) {
              iTab[i][j] = élément;
         }
}
La différence là est que les sous tableaux donc dans la deuxième dimension n'auront plus la même taille.
Donc les tableaux ne seront plus carrés mais triangulaire. (Ceci est utile si vous devez faire par exemple un triangle de Pascal et évite de gaspiller de la mémoire)

On peut aussi créer des tableaux triangulaire de cette manière :
1
2
3
4
5
int iTab = new int[5][]; //Création de la première dimension. (Tableau principal)
for (int i = 0; i < 5; i++) {
    iTab[i] = new int[i]; //Création des sous tableaux dans les éléments de la première dimension.
    System.out.println(iTab[i].length()); //Récupération de la taille du sous tableau dans la première dimension à l'élément i.
}

On peut bien sur créer des tableaux à 3 dimensions (matrices spatiales), 4 dimensions, etc... Mais ceci est tout de suite plus compliqué et donc pas conseillé d'utiliser. On se limitera à des tableaux de maximum 3 dimensions, lorsque l'on verra la 3D.


On peut bien sur regrouper initialisation et déclaration d'un tableau en une seule instruction comme ceci :
1
int [] = new int[10];

On peut aussi regrouper  déclaration, création et initialisation comme ceci :
1
Etudiant etudiants[] = new etudiants[]{etudiant1, etudiant2};

Les limites d'un tableau.



La taille d'un tableau ne peut pas être modifiée tout au long d'un programme, une fois qu'elle est fixée, c'est tout! (On ne peut plus la changer!)
Cependant il est possible d'utiliser la même variable pour créer un autre tableau.
1
2
int monTableau = new int [6];
monTableau = new int [10];

Dans ce cas les valeurs du tableaux initial (de taille 6) seront perdues.
La solution sera donc de copier les valeurs du tableau initial dans un autre.


Opérations basiques sur les tableaux.


La copie d'un tableau dans un autre se fait à l'aide de la méthode arraycopy de la classe System.

Utilisation de la méthode arraycopy :



Cette méthode possède 5 arguments : le nom du tableau original, le numéro de la ligne du tableau original où l'on souhaite débuter la copie, le nom du tableau cible,  le numéro de la première ligne du tableau cible ou l'on veut commencer à copier, et la longueur du tableau original.

Il faut donc commencer par créer 2 tableaux :
1
2
3
4
int [] iTabOrigine = new int [5];
int [] iTabCible = new int [5];
 
iTabOrigine = {0,1,2,3,4};

Maintenant on veut faire la copie des éléments 2 3 et 4 dans notre tableau cible.
Comment faire ? Il suffit d'écrire :
1
System.arraycopy (iTabOrigine, 2, iTabCible, 1, iTabOrigine.length);

Cela va nous donner comme valeurs dans le tableau cible : {0,2,3,4,0};

On commence à copier les éléments du tableau original à partir de la ligne n°2 de celui-ci, et on veut copier ces valeurs à partir de la ligne n°1 dans le tableau cible, c'est pour cela qu'on a un zéro comme première valeur dans le tableau cible.
Donc, on a le la ligne n°2 du tableau origine, copiée dans la ligne n°1 du tableau cible.
Ensuite la ligne n°3 du tableau origine, copiée à la ligne n°2 du tableau cible et ainsi de suite jusqu'à ce que on arrive à la dernière ligne du tableau original.
Attention que le tableau cible doit avoir une taille assez grande pour pouvoir contenir les éléments du tableau origine que vous copier.

Rappel : N'oublier jamais que l'index du premier élément d'un tableau est 0, que ce soit pour des tableaux de 1, 2 ou n dimensions.
Bien sûr, on peut ne rien mettre dans la ligne n°0 du tableau et mettre la première valeur dans la ligne n°1 du tableau, par facilité, mais vous aurez alors un élément en mémoire centrale qui ne servira à rien.
Mais en Java je vous conseille de commencer à l'indice zéro quand même car toutes les classes préexistantes suivent ce principe.


Si vous faîtes des tableaux d'objets, seul les références en mémoire de ces objets sont copiées, les objets eux même sont identiques, ce sont des clônes.


Le tri d'une tableau


Pour cela il y a une méthode qui s'appelle sort et qui peut trier des nombres par ordre croissant.
Il faut utiliser pour cela la classe Arrays, qui est une classe statique qui ne crée par d'objets.
Cette classe permet juste de faire des recherches et tri dans un tableau.
Il faut l'importer, elle se trouve dans java.util

1
2
int[] tableau = new int[]{5, 7, 6, 10, 1};
Arrays.sort(tableau);

Pour savoir si un tableau ne contient déja pas un nombre, on utilise la méthode binarySearch et elle renvoie -1 si le nombre n'est pas dans le tableau sinon elle renvoie l'indice de l'élément :
1
2
3
4
5
6
int[] tableau = new int[]{5, 7, 6, 10, 1};
int indice = Arrays.binarySearch (tableau, 10);
if (indice == -1)
   System.out.println("Le nombre n'est pas dans le tableau");
else
   System.out.println("Le nombre est dans le talbleau en position : "+indice);

Plus tard je vous montrerez comment on peut trier n'importe quel tableau d'objets, et de définir le critère de comparaison.
en effet les objets sont un peu plus complexe à trier, car un objet peut être n'importe quoi et Java ne sais pas comment les trier si on en lui dis pas.



Exercices


1) Créer un programme Java capable de générer deux tableaux d'entiers aléatoirement, la taille de ses deux tableaux étant demandé à l'utilisateur.

Les nombres générés aléatoirement dans ces deux tableau devront être comprit entre 0 et 100, et trier.
Ensuite fusionner ces deux tableaux pour en former un troisième, qui sera lui aussi trier.

2) Crée un tableau à deux dimension avec nom qui pourra par exemple stocker les noms des membres qui sont inscrit sur jeux-libres.com et pseudo qui stockera les pseudos.

Le nom et le pseudo seront à faire encoder par l'utilisateur, il faudra dire combien il y a de membres à encoder, et il faudra faire gaffe que le tableau ne peut que stocker 100 membres, donc il faudra mentionner à l'utilisateur si le tableau est plein et arrêter le programme.

3)Sur bas de l'exercice deux, après que l'utilisateur ai rentrer le nom de tout les membre, demander lui si il veut en rechercher un, et si oui, faîtes une recherche mais l'utilisateur aura la possibilité de soit le rechercher sur base de son nom, ou alors, de son pseudo!


Solution de l'exercice sur les tableaux.


[code=java]
import java.util.Scanner;
import java.util.Arrays;
public class exercTableaux3 {
      public static void main (String[] args) {
           Scanner lecture = new Scanner (System.in);
           System.out.println("Entrer la taille du premier tableau : ");
           int taille1 = lecture.nextInt ();
           System.out.println("Entrer la taille du second tableau : ");
           int taille2 = lecture.nextInt ();
           int[] iTab1 = new int[taille1];
           int[] iTab2 = new int[taille2];
           int taille3 = taille1 + taille2;
           int[] iTab3 = new int[taille3];
           System.out.println("Génération du premier tableau.");
           for (int i = 0; i < iTab1.length; i++) {
               iTab1[i] = (int) (Math.random () * 100);
               System.out.println(iTab1[i]);
           }
           System.out.println("Génération du second tableau.");
           for (int i = 0; i < iTab2.length; i++) {
               iTab2[i] = (int) (Math.random () * 100);
               System.out.println(iTab2[i]);
           }
           Arrays.sort(iTab1);
           Arrays.sort (iTab2);
           System.arraycopy (iTab1, 0,iTab3 , 0, iTab1.length);
           System.arraycopy (iTab2, 0, iTab3, iTab1.length, iTab2.length);
           Arrays.sort (iTab3);
           System.out.println("Affichage du tableau 3, fusion des deux premiers.");
           for (int i = 0; i < iTab3.length; i++) {                
               System.out.println(iTab3[i]);
           }
           
       }
}
[/code]

Solution des exercices 2 et 3.
[code=java]
import java.util.Scanner;

public class Eco23Tableaux{
   // instance variables - replace the example below with your own
 
   
   /**
    * Constructor for objects of class Eco23Tableaux
    */
   public static void main (String args[]) {
       String membres[][] = new String[2][100];
       Scanner lectureClavier = new Scanner (System.in);
       System.out.println("Entrer le nombres de membres à inscrire.");
       int nbMembres = lectureClavier.nextInt ();
       lectureClavier.nextLine();
       for (int i = 0; i < nbMembres; i++) {
           if (i < 100) {
               System.out.println("Quel est le nom de membre n°"+(i+1)+" ?");
               membres[0][i] = lectureClavier.nextLine ();                
               System.out.println("Quel est le pseudo de membre n°"+(i+1)+" ?");
               membres[1][i] = lectureClavier.nextLine ();
           } else {
               System.out.println("Erreur, le tableau est remplit!");
               break;
           }
       }
       System.out.println("Voulez vous rechercher un membre ? (tappez oui ou non)");
       String reponse = lectureClavier.nextLine ();
       if (reponse.equals ("oui")) {
           System.out.println("Entrer 1 pour rechercher le nom ou 2 pour rechercher le pseudo du membre.");
           int typeRecherche = lectureClavier.nextInt ();
           lectureClavier.nextLine ();
           if (typeRecherche == 1) {
               System.out.println("Tapper le nom du membre à recherher : ");                
               String nomARech = lectureClavier.nextLine ();
               int i = 0;
               while (!membres[0][i].equals (nomARech) && i < membres.length)
                   i++;
               if (i >= 100)
                   System.out.println("Erreur : nom du membre pas trouvé");
               else
                   System.out.println("Nom du membre : "+membres[0][i]+" pseudo du membre : "+membres[1][i]);
           } else {
               System.out.println("Tapper le pseudo du membre à rechercher : ");
               lectureClavier.nextLine ();
               String pseudoARech = lectureClavier.nextLine ();
               int i = 0;
               while (!membres[1][i].equals (pseudoARech) && i < membres.length)
                   i++;
               if (i >= 100)
                   System.out.println("Erreur : psuedo du membre pas trouvé");
               else
                   System.out.println("Nom du membre : "+membres[i][0]+" "+" pseudo du membre : "+membres[0][i]);
           }
           System.out.println("Programme terminé!");
       }
   }
}
[/code]




<!-- o mise en gras -->Il existe donc des tableaux à 1, 2, ou n dimensions. Ceux ci sont en fait des variables indexées. Chaque valeur de cette variable indexée est référencée par un numéro qui peut varier de 0 jusqu'à la taille du tableau - 1. Attention, jamais de valeur négative, et de nombre à virgules pour désigner l'élément d'un tableau. Attention à cela car si votre tableau fait 5 lignes , si vous lui demander d'afficher la valeur n°6 du tableau, il vous mettra une erreur lors en exécution, car vous dépasser la capacité de votre tableau.
<!-- f mise en gras -->



Chapitre précédent     Sommaire     Chapitre suivant



Rédigé par Lo
Consulté 3337 fois



Hébergeur du site : Raspberry Pi
Version PHP : 5.4.4-14+deb7u7
Uptime : 7 jours 15 heures 45 minutes
Dernière sauvegarde : 23/04/2014



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

2663163 pages ont été consultées sur le site !
Dont 512 pages pendant les 24 dernières heures.

Page générée en 0.362 secondes


Nos partenaires
- Créer vos jeux avec html5 et android
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo
- Création d'un jeu de plateforme de A à Z avec SDL


  © 2005-2014 linor.fr - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.