Tableaux
en Java
Généralités sur les Tableaux
Les tableaux sont des objets en java et non seulement une suite
d'emplacements mémoire comme il est le cas en C/C++
Ils constituent des collections ordonnées d'éléments
Les éléments d'un tableau peuvent être :
des variables de type primitif (int, boolean, double, char...)
des références sur des objets ( y compris des références sur
d'autres tableaux)
Tableaux 2
Déclaration d’un tableau à une dimension
Déclaration
typeDesElements[] nomDuTableau;
ou bien
typeDesElements nomDuTableau[];
avec
typeDesElements un des types de base du langage JAVA
(char, int, float, double...) ou un nom de classe
nomDuTableau l’identificateur pour désigner le tableau
Remarque : Il est recommandé d’utiliser la première forme de déclaration car permet de
déclarer plusieurs tableaux ayant le même type des éléments en une seule ligne .
Exemples
double [] tab1; //identique à double tab[]
Int[] entiersPremiers, nombresCubes; //déclare deux tableaux dont les éléments sont de type int
Etudiant[] classe; //déclare un tableau dont les élements sont des objets instances de la classe Etudiant
Compte[] clients; //déclare un tableau dont les élements sont des objets instances de la classe Compte
3
Création d’un tableau à une dimension
la taille d'un tableau n'est pas spécifiée à la déclaration.
les tableaux sont des objets,
La déclaration : typeDesElements[] nomDuTableau;
définit une référence vers un objet de type "tableau d'éléments de type
typeDesElements".
Le nombre d'éléments du tableau sera déterminé quand l'objet tableau sera
effectivement créé en utilisant new.
cette taille fixée à la création est fixe, elle ne pourra plus être modifiée par la
suite.
Exemple
int[] entiersPremiers; //déclaration d’une référence vors l’objet tableau
entiersPremiers = new int[50]; //Création de l’objet tableau de 50 entiers
//Déclaration et création d’un tableau de 1000 élements de type Compte
Compte[] listeDesComptes = new Compte[1000]; Tableaux 4
Création d’un tableau à une dimension
La création d ’un tableau par new
alloue la mémoire nécessaire en fonction
du type des éléments du tableau
de la taille spécifiée
initialise le contenu du tableau
les éléments de types primitifs sont initialisés à 0
les éléments de type classe sont initialisé à null
(car chaque élément est une référence à un objet instance de la classe.
Et chaque élément doit être créé par new et rangé dans le tableau)
Tableaux 5
Tableaux à une dimension
Exemples de Création
int[ ] tab1; isa
tab1 = new int[5]; tab1
int[ ] tab2 = tab1; 0 0
1 0
tab2 2 0
3 0
4 0
Etudiant[ ] classe1; isa
classe1 = new Etudiant[4]; classe1
null
Etudiant[ ] classe2 = classe1; 0
classe2 1
2
Tableaux 6
Tableaux à une dimension
Accès aux éléments
accès aux éléments d’un tableau unidimensionnel
accès à un élément d'un tableau s'effectue à l'aide d'une expression
de la forme : nomDuTableau[expression1]
où
expression1 s’évalue en une valeur entière dans les bornes du tableau
(>= 0 : plus petit indice et <= length-1 : plus grand indice)
on peut rencontrer une telle expression aussi bien en partie gauche
qu’en partie droite dune affectation
length donne la dimension (entier) du tableau
[Link] = indice max c-a-d indice du dernier élément du
tableau
Java vérifie automatiquement l'indice lors de l'accès (comparaison avec les
bornes)
Si l’indice est en dehors de l’intervalle [0, length-1] => génération de
l’exception: ArrayIndexOutOfBoundsException Tableaux 7
Tableaux à une dimension
Précison sur length
Précision sur lenght
Lenght est une variable d’instance publique
=>(non respect du principe d’encapsulation)
Lenght est déclarée public final
=>(Initialisation à la création du tableau, et ne peut pas être modifiée)
[Link] = dimension (nombre d’éléments) du tableau
[Link] – 1 = indice max du tableau
public class TestArgs {
public static void main(String[] args) {
Ce programme
[Link]("nombre d ’arguments : " + [Link]); permet d’afficher les
arguments fournis
for (int i =0; i < [Link]; i++) dans la ligne de
commande lors de
[Link](" argument " + i + " = " + args[i]); l’exécution du
} programme
}
Tableaux 8
Tableaux à une dimension
Exemples de Création
int[ ] tab1; isa
tab1 = new int[5]; tab1
tab1[0] = 1; 0 1
for (int i=1; i<5; i++) 1 2
tab1[i] = tab1[i-1]*2; 2 4
3 8
4 16
isa
nom Moha
Public class Etudiant{
String nom, prenom; isa prenom Ali
classe1
double note;
} note 17
0 null
Public Etudiant(String n, String p,double score){
nom = n; prenom = p; note = score; 1
}} 2
3
Etudiant[ ] classe1 = new Etudiant[4];
Classe[0] = new Etudiant(« Moha », « Ali », 17); Tableaux 9
Initialisation d’un tableau à une dimension
Initialisation d’un tableau = une autre manière de créer des tableaux :
en donnant explicitement la liste de ses éléments à la déclaration
(liste de valeurs entre accolades)
Exemples :
int[ ] tab1 = { 1, 2 ,3, 4, 5};
Etudiant[ ] classe1 = { new Etudiant(« Moha », « Ali », 15),
new Etudiant(« Toto », «Najib », 12),
new Etudiant(« Manolo », «Brahimi », 11),
new Etudiant(« Kardi », « Rachid », 17) };
L ’allocation mémoire (équivalent de l ’utilisation de new) est prise en
charge par le compilateur
Tableaux 10
Tableaux à plusieurs dimension
Déclaration
tableau dont les éléments sont eux mêmes des tableaux
un tableau à deux dimensions se déclarera ainsi de la manière suivante :
typeDesElements[ ][ ] nomduTableau;
Exemples
double[ ][ ] matrice;
Etudiant[ ][ ][ ] cubeEtud;
Tableaux 11
Tableaux à plusieurs dimension
Création
dimensions du tableau
ne sont pas spécifiées à la déclaration (comme pour les tableaux à une
seule dimension).
ne sont indiquées que lors de la création
obligatoire que pour la première dimension.
autres dimensions peuvent n'être spécifiées que lors de la
création effective des tableaux correspondants.
Exemples :
double [ ][ ] matrice = new double[4][4]; Création d’une matrice 4x4
de réels
double [ ][ ] matrice = new double[4][ ];
for (int i=0; i < 4; i++)
matrice[i] = new double[4]; Les 3 écritures sont
équivalentes
double [ ][ ] matrice;
matrice = new double[4][ ];
for (int i=0; i < 4; i++)
matrice[i] = new double[4]; Tableaux 12
Tableaux à plusieurs dimension
Création
chaque tableau imbriqué peut avoir une taille différente.
Exemple :
isa
int [ ][ ] tabsInt; 0 0
tabsInt = new int[3][ ]; 1 0 isa
tabsInt[0] = new int[5]; 2 0
tabsInt[1] = new int[4]; 3 0 0 0
4 0 1 0
tabsInt[2] = new int[6];
2 0
3 0
tabsInt isa
isa
0
1 0 0
2 1 0
2 0
3 0
4 0
Tableaux 5 0 13
Accès aux éléments d’un tableau à plusieurs dimensions
accès aux éléments d’un tableau à deux dimensions
L’accès à un élément d'un tableau s'effectue à l'aide d'une expression de la forme :
nomDuTableau[expression1][expression2]
où
– expression1 s’évalue en une valeur entière entre les bornes
0 et [Link] - 1
– expression2 délivre une valeur entière entre les bornes
0 et nomDuTableau[expression1].length - 1
char[ ][ ] tabChar = new char[3][ ];
tabChar[0] = new char[4];
tabChar[1] = new char[6];
tabChar[2] = new char[5]
tabChar[0][0] = ‘J’; tabChar[0][1] =‘A’; tabChar[0][2] = ‘V’; tabChar[0][3] =‘A’;
tabChar[1][0] = ‘B’; tabChar[1][1] =‘R’; tabChar[1][2] = ‘A’; tabChar[1][3] =‘V’; tabChar[1][4] = ‘E’;
tabChar[1][5] =‘R’;
tabChar[2][0] = ‘C’; tabChar[2][1] =‘O’; tabChar[2][2] = ‘B’; tabChar[2][3] =‘O’; tabChar[2][4] = ‘L’;
Initialisation d’un tableau à plusieurs dimensions
Il est possible de créer un tableau à plusieurs dimensions en initialisant
ses éléments lors de sa déclaration (Comme pour tableaux à une dimesion)
exemples :
int[ ][ ] t1 = { int[ ][ ] t1 = new int[2][5];
t1[0][0]=1; t1[0][1]=2; t1[0][2]=3; t1[0][3]=4; t1[0][4]=5;
{ 1, 2, 3, 4, 5},
{ 6, 7, 8, 9, 10} ≡
t1[1][0]=6; t1[1][1]=7; t1[1][2]=8; t1[1][3]=9; t1[1][4]=10;
};
Point[ ][ ] pts = {
Point[ ][ ] pts = new Point[3][2];
{ new Point(10,15),new Point(20,25)},
{ new Point(30,35), new Point(40,45)} , ≡ Pts[0][0] = new Point(10,15); Pts[0][1] = new Point(20,25);
Pts[1][0] = new Point(30,35); pts[1][1] = new Point(40,45) ;
{ new Point(50,55),new Point(60,65)} , Pts[2][0] = new Point(50,55); ,pts[2][1] = new Point(60,65) ;
};
Tableaux 15
Classe Arrays : Tri d’un tableau
package [Link] définit une classe, Arrays, qui propose des méthodes
statiques (de classe) pour le tri et la recherche dans des tableaux.
Exemple : tri d’un tableau
// tableau de 1000 réels tirés au hasard
// dans l ’intervalle [0..100[
double[ ] tab = new double[100];
for (int i = 0; i < [Link]; i++)
tab[i] = [Link]()*100;
// tri du tableau
[Link](tab);
// affichage du tableau trié
for (int i = 0; i < [Link]; i++)
Tableaux 16
[Link](tab[i] + " " );
Classe Arrays : Recherche d’une donnée dans un tableau
Exemple : recherche dans un tableau
// tableau de 100 entiers tirés au hasard
// dans l ’intervalle [0..100[
int[ ] tab = new int[100];
for (int i = 0; i < [Link]; i++)
tab[i] = (int) ([Link]()*100);
// tri du tableau
[Link](tab);
// recherche de la valeur 45
int pos = [Link](tab,45);
// utilisation des résultats de la recherche
if (pos >= 0)
[Link]("position de 45 : " + pos);
else {
[Link](« 45 n ’est pas dans le tableau");
[Link]("position d ’insertion : " + (-(pos+1))); 17
}
Classe Arrays : Quelques méthodes extraites
de la documenetation de l’API
static boolean deepEquals(Object[] a1, Object[] a2)
Returns true if the two specified arrays are deeply equal to one another.
static void fill(double[] a, double val)
Assigns the specified double value to each element of the specified
array of doubles.
static String toString(double[] a)
Returns a string representation of the contents of the specified array.
static void sort(double[] a)
Sorts the specified array of doubles into ascending numerical order.
static void sort(double[] a, int fromIndex, int toIndex)
Sorts the specified range of the specified array of doubles into ascending
numerical order.
Tableaux 18
[Link]()
The subroutine, [Link](), is a static member subroutine in the
standard System class. Its declaration has the form
public static void arraycopy(Object sourceArray, int sourceStartIndex,
Object destArray, int destStartIndex, int count)
For example, to make a copy of the array, A, using this subroutine, you would say:
double B = new double[[Link]];
[Link]( A, 0, B, 0, [Link] );
Tableaux 19
Arrays and for-each Loops
BaseType[ ] anArray = new BaseType[N];
for ( BaseType item : anArray ) {
.
. // process the item
.
}
for ( int index = 0; index < [Link]; index++ ) {
BaseType item;
item = anArray[index]; // Get one of the values from the array
.
. // process the item
.
}
Tableaux 20
It’s important to note that a for-each loop processes the values in the array, not the
elements (where an element means the actual memory location that is part of the
array).
For example, consider the following incorrect attempt to fill an array of integers with
17’s:
int[] intList = new int[10];
for ( int item : intList ) { // INCORRECT! DOES NOT MODIFY THE
ARRAY!
item = 17;
}
The assignment statement item = 17 assigns the value 17 to the loop control
variable, item.
However, this has nothing to do with the array. When the body of the loop is
executed, the value from one of the elements of the array is copied into item.
The statement item = 17 replaces that copied value but has no effect on the
array element from which it was copied; the value in the array is not
changed. Tableaux
21