· Un tableau est un regroupement d’éléments de même type auxquels on accède par un indice entier.
· En java on peut construire des tableaux à partir de n’importe quel type.
· En java un tableau est un objet.
· En java un tableau a une taille fixe (qui peut être nulle) obtenue par length
· En java les indices du tableau vont de 0 à length-1
· En java une tentative d’accès hors des bornes du tableau provoque un erreur (exception IndexOutOfBoundException)
Il faut distinguer entre une variable d’un type et un objet tableau.
Déclaration d’une variable de type tableau d’entiers :
int
[] tab ;
Création d’un objet tableau de 4 entiers :
tab=new
int[4] ;
Un objet tableau a une taille fixe.
for(int
i=0 ;i<t.length ;i++)t[i]=i;
t[4] provoque une exception
(les entiers sont directement dans les cases du tableau parce que int est un type primitif)
· L’affectation ne copie pas le tableau.
int
[] t ;
t=tab ;
o On peut définir une copie de tableau :
static
int[] copier(int[] x){
int n = x.length;
int[] y = new int[n];
for(int i = 0; i
< n; i++)
y[i] = x[i];
return y;
}
t=copier(tab) ;
· L’égalité == teste si les variables sont des références sur le même tableau. On peut tester l’égalité des contenus. (S’il s’agit d’un tableau d’objets –et non d’int- cette égalité serait l’égalité des références)
static boolean
estEgal(int[] x, int[] y){
if(x.length != y.length) return false;
for(int i = 0; i < x.length; i++)
if(x[i] != y[i])
return false;
return
true;
}
· Une méthode peut avoir un tableau en paramètre :
public static void
remplir(int [] t){
for(int
i=0;i<t.length;i++){
t[i]=(int)(Math.random()*1000);
}
}
On remarquera :
§ le contenu du tableau t est modifié dans la méthode (même si le passage de paramètre est un passage par valeur, le paramètre est une référence sur un objet tableau, la valeur de la référence n’est pas modifiée)
§ la méthode (static) Math.random() retourne un double compris entre 0 et 1, ici en multipliant par 1000 et en forçant le type à int on obtient un entier aléatoire entre 0 et 1000.
· Une méthode peut retourner un tableau.
public static int []
retourne(int [] t){
int []
r=new int[t.length];
for(int i=0;i<t.length;i++){
r[r.length-i-1]=t[i];
}
return r;
}
Cette méthode retourne un tableau de même taille contenant le tableau « à l’envers»
Manipulations sur les identite et les comptes
(b)Initialisations
On peut initialiser les tableaux (on notera que le dernier exemple crée
un objet tableau sans passer par une variable).
int [] t={1,2,3} ;
String [] animaux={"chien",
"chat", "souris"} ;
int [][]tab={{1,2},{0,3}};
somme(new int [] {1,2,3});
Comme on peut construire des tableaux à partir de n'importe quel type, on peut construire des tableaux sur des types tableaux: les tableaux de tableaux correspondent à des tableaux à plusieurs dimensions.
int [][] t= new int[2][3];
int [][]
tab= new int [3][];
Notons que : t.length vaudra 2 (car t est un tableau de 2 tableaux de 3 entiers) et tab est un tableau de 3 tableaux d'entiers (les objets associés ne sont pas créés). t[0].length vaut 3 car c'est un tableau de 3 entiers.
Exemples:
Produit de matrices:
// un produit de
matrices
public static int[][]
produit(int [][]t1,int [][]t2){
int
[][]r=new int[t1.length][t2[0].length];
for(int i=0;i<t1.length;i++)
for(int j=0;j<t2[0].length;j++){
r[i][j]=0;
for(int k=0;k<t1[0].length;k++)
r[i][j]+=t1[i][k]*t2[k][j];
}
return r;
}
Comme un tableau à plusieurs dimensions est un tableau de tableau, rien n'oblige à ce que chacun de ces tableaux aient la même dimension. On peut par exemple faire des tableaux triangulaires. L'exemple suivant construit un triangle de Pascal.
// tableaux de
tableaux...
// un tableau
triangulaire...
// le triangle de
pascal
public static int[][]
pascal(int n){
int[][]
p=new int[n][];
p[0]=new int[1];
p[0][0]=1;
for(int i=1;i<p.length;i++){
p[i]=new int[i+1];
p[i][0]=1;
for(int j=1;
j<i;j++){
p[i][j]=p[i-1][j-1]+p[i-1][j];
}
p[i][i]=1;
}
return p;
}