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
}
}