6.    Les tableaux



6.1    Introduction

Ensemble d’éléments de même type désignés par un nom unique. Chaque élément est accédé directement et il est repéré par un indice.

Fig. 6.1 Tableau de dix éléments


int tE[];   - référence

6.2    Création et initialisation de tableaux

tE = new int[5] ; // tE fait référence à un tableau de 5 entiers



Fig. 6.2 Déclaration d'un tableau

int tE[] ;        int [] tE ;

int [] tE1, tE2 ; // tE1 et tE2 sont des références à des tableaux d’entiers
est équivalent à :
int tE1[], tE2[] ;

int tE1[], n, tE2[] ; // tE1 et tE2 sont des tableaux d’entiers, n est entier.

Person tp[] = new Person [10];
Lors de la déclaration d’une référence de tableau, on peut fournir une liste d’expressions entre accolades, comme dans :
char voyelle[ ] = {'a', 'e', 'i', 'o', 'u'}; // un tableau de cinq éléments.
int n;

int tb[ ] = { 10,2*n, 14, n+5}; //un tableau de quatre éléments.

int tE[5] ; // erreur : on ne peut pas indiquer de dimension ici.
tb = { 10,2*n, 14, n+5}; // erreur, l'initialisation  n’est utilisable que dans une déclaration.

6.3    Utilisation de tableaux

length
public class Tab {
    public static void main(String arg[]){
        char vowel[] = {'a','e','i','o','u'};
        System.out.println ("number of vowel elements: "+vowel.length);
    }
}

element access
public class Tab1 {
    public static void main(String arg[]){
        char vowel[] = {'a','e','i','o','u'};
        System.out.println("vowel elemenets:");
        for(int i=0;i < vowel.length;i++){
            System.out.print ("\t"+vowel[i]);
        }
        System.out.println();
    }
}

Structure de contrôle adaptée aux collections  for ... each (ne s’applique qu’à des consultations de valeurs)
public class Tab2 {
    public static void main(String arg[]){
        char vowel[] = {'a','e','i','o','u'};
        System.out.println("vowel elements:");
        for(char v:vowel){
            System.out.print ("\t"+v);
        }
        System.out.println();
    }
}

System.arraycopy(source,début_Source, destination, début_Destination,longueur);
public class Vowl {
    public static void main(String arg[]){
        char vowel[] = {'a','e','i','o','u'};
        System.out.println("vowel elements:");
        for(char v:vowel){
            System.out.print ("\t"+v);
        }
        System.out.println();
        char tmp[] = new char[vowel.length+1];
        System.arraycopy(vowel, 0, tmp, 0, vowel.length);
        tmp[tmp.length-1]= 'y';
        vowel = tmp;
        System.out.println("vowel elements:");
        for(char v:vowel){
            System.out.print ("\t"+v);
        }
        System.out.println();
    }
}


Fig. 6.3 Affectation des deux références du tableau


6.4    Tableaux multidimensionnels


Fig. 6.4 Un tableau à deux dimensions de deux lignes et d’un nombre variable de colonnes.

Les déclarations suivantes sont équivalentes.
int tab[][];
int [] tab [];
int [][] tab;

Matrice créée avec new
public class Matrix {
    public static void main(String arg[]){
        int matrix[][] = new int[3][6];
        for(int line[]:matrix ){                     // for ... each
            for (int k : line){                     //for … each
                System.out.print("\t"+k);
            }
            System.out.println();
        }
    }
}

Matrice avec initialisation
public class Matrix1 {
    public static void main(String arg[]){
        int matrix[][] = {{1,2*3,7},{6,8,9}};
        for(int line[]:matrix ){
            for (int k : line){
                System.out.print("\t"+k);
            }
            System.out.println();
        }
    }
}

Tableau irrégulier
public class Tabl {
    public static void main(String arg[]){
        int ex[][] = new int[3][ ];
        ex[0] = new int [3];
        ex[1] = new int[5];
        ex[2] = new int[4];
        for(int line[]:ex ){
            for (int k : line){
                System.out.print("\t"+k);
            }
            System.out.println();
        }
    }
}

Avec l'initialisation
public class Tabl1 {
    public static void main(String arg[]){
        int ex[][] = {{1,2,3},{4,5,6,7},{8,9}};
        for(int line[]:ex ){
            for (int k : line){
                System.out.print("\t"+k);
            }
            System.out.println();
        }
    }
}

Lorsqu’on transmet un nom de tableau en argument, ou en retour d’une méthode, on transmet en fait (une copie de) la référence au tableau. La méthode agit alors directement sur le tableau concerné et non sur une copie.
Méthode statique pour modifier les valeurs

public class Tabl2 {
    public static void main(String arg[]){
        int ex[][]={{1,2,3},{4,5,6,7},{8,9}};
        init(ex);
        for(int line[]:ex ){
            for (int k : line){
                System.out.print("\t"+k);
            }
            System.out.println();
        }
    }
    public static void init(int tb[][]){
        for(int i=0;i<tb.length;i++){
            for(int j =0; j<tb[i].length;j++){
                tb[i][j]=(int)(Math.random()*10);
            }
        }
    }
}

Les référenses des lignes du tableau peuvent changer pendant l'exécution du programme
public class Tab_ir {
    public static void main(String arg[]){
        int tab[][] = new int[3][2];
        prt(tab);
        tab[1] = new int [4];
        prt(tab);
    }
    public static void prt(int tab[][]){
        System.out.println("\ntab:");
        for(int line[]:tab ){
            for (int k : line){
                System.out.print("\t"+k);
            }
            System.out.println();
        }       
    }
}

6.5    Les tableaux d'objets

class Birthday
public class Birthday {
    private int day,month,year;
    public Birthday(int d, int m, int y){
        this.day = d;
        this.month=m;
        this.year = y;
    }
    public String toString(){
        return "("+day+","+month+","+year+")";
    }
}

Birthday tab[] = new Birthday[2];


Fig. 6.5 Tableau de deux références nulle

Pour créer des objets il faut appeler le constructeur pour chaque référence:
tab[0] = new Birthday(7, 7, 1980);
tab[1] = new Birthday(20, 12, 1984);


Fig. 6.6 Tableau de deux objets

On peut l'initier le tableau lors de sa déclaration
Birthday tab[] = {new Birthday(7,7,1980, new Birthday(20,12,1984)};

Exemples

Тableau unidimensionnel

public class Tab1 {
    public static void main(String[] arg) {
        Birthday[] bd1= {new Birthday(8,12,2001),new Birthday(3,4,1978)},
                  bd2= new Birthday[2];

        System.out.print("bd1: ");
        for(Birthday b:bd1) {
            System.out.print("\t"+b);           
        }
        System.out.println();
        System.out.print("bd2: ");
        for(Birthday b:bd2) {
            System.out.print("\t"+b);           
        }
        System.out.println();
        bd2[0]=new Birthday(9,1,2000);
        bd2[1]=new Birthday(4,3,1976);
        System.out.print("bd2: ");
        for(Birthday b:bd2) {
            System.out.print("\t"+b);           
        }
    }
}

Тableau à deux dimensions

public class Tab {
    public static void main(String arg[]){
        Birthday bd[][]=new Birthday[3][4];
        init(bd);
        for(Birthday line[]:bd ){
            for (Birthday k : line){
                System.out.print("\t"+k);
            }
            System.out.println();
        }
    }
    public static void init(Birthday tb[][]){
        int months[][]= {{1,3,5,7,8,10,12},   //31 days
                                 {4,6,9,11} };        //30 days
        for(int i=0;i<tb.length;i++){
            for(int j =0; j<tb[i].length;j++){
                int year = (int)(Math.random()*80+1940); // from 1940 to 2019
                int month = (int)(Math.random()*12+1);    // from 1 to 12
                int day;
                if (in(months,month)==0) {
                    day=(int)(Math.random()*31+1);         // from 1 to 31
                }
                else if(in(months,month)==1) {
                    day=(int)(Math.random()*30+1);       // from 1 to 30                  
                }
                else if (year%400==0||(year%4==0)&&(year%100!=0)) {
                    day=(int)(Math.random()*29+1);     // from 1 to 29 leap year
                }
                else {
                    day=(int)(Math.random()*28+1);     // from 1 to 28
                }
                tb[i][j]=new Birthday(day,month,year);
            }
        }
    }
    public static int in(int months[][], int crmonth) { //in line 0 - 31 days
        for (int i =0;i<months.length;i++) {            //in line 1 - 30 days
            for(int j=0;j<months[i].length;j++) {
                if (crmonth == months[i][j]){
                    return i;
                }
            }           
        }
        return -1;  // not found
    }
}