📊 Le cours : ranger plusieurs valeurs
Un tableau range plusieurs valeurs du même type sous un seul nom. Sa taille est fixée à la création. Les notions générales (indices, parcours, copies) sont celles du chapitre Tableaux 1D ; ici, c'est leur version Java.
Déclarer, créer, initialiser
int[] t déclare une variable qui pourra désigner un tableau d'entiers ; new int[5] crée le tableau. Les cases reçoivent une valeur par défaut : 0 pour les nombres, false pour les booléens, null pour les objets (dont les String).
public class Declaration {
public static void main(String[] args) {
int[] a = new int[3]; // 0 0 0
double[] b = {1.5, 2.5};
boolean[] c = new boolean[2]; // false false
String[] d = new String[2]; // null null
System.out.println(a[1] + " " + b.length + " " + c[0] + " " + d[1]);
}
}
Parcourir un tableau
Avec un for classique quand on a besoin de l'indice, avec un for-each sinon. Voici la recherche de l'indice du maximum.
public class Maximum {
public static void main(String[] args) {
int[] t = {3, 9, 2, 7};
int imax = 0;
for (int i = 1; i < t.length; i++) {
if (t[i] > t[imax]) {
imax = i;
}
}
System.out.println("max = " + t[imax] + " a l'indice " + imax);
}
}
Affichagemax = 9 a l'indice 1
Un tableau est un objet : attention aux alias
La variable b d'un int[] b = a; ne contient pas une copie du tableau, mais la même référence : les deux noms désignent le même tableau. Pour une vraie copie, utilise clone() ou Arrays.copyOf. (C'est le phénomène d'*aliasing* de Aliasing et copies.)
public class Alias {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int[] b = a; // même tableau, pas une copie
b[0] = 99;
System.out.println(a[0]);
int[] c = a.clone(); // vraie copie
c[1] = 77;
System.out.println(a[1]);
}
}
Passer un tableau à une méthode
La méthode reçoit la copie de la référence : elle peut modifier le contenu du tableau de l'appelant. Contrairement au C, elle connaît sa taille grâce à t.length.
public class Methodes {
static int somme(int[] t) {
int s = 0;
for (int x : t) {
s += x;
}
return s;
}
static void doubler(int[] t) {
for (int i = 0; i < t.length; i++) {
t[i] *= 2;
}
}
public static void main(String[] args) {
int[] t = {1, 2, 3, 4};
doubler(t);
System.out.println(somme(t));
}
}
Tableaux à deux dimensions
Un int[][] est un tableau de tableaux : g.length est le nombre de lignes, g[i].length le nombre de colonnes de la ligne i (les lignes peuvent avoir des longueurs différentes). On le parcourt avec deux boucles imbriquées ; voir Tableaux 2D pour le raisonnement général.
public class Matrice {
public static void main(String[] args) {
int[][] g = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < g.length; i++) {
for (int j = 0; j < g[i].length; j++) {
System.out.print(g[i][j] + " ");
}
System.out.println();
}
}
}
Un algorithme classique : le tri à bulles
Les deux boucles imbriquées et l'échange de deux cases via une variable temporaire sont ceux de la fiche NSI Tri à bulles.
import java.util.Arrays;
public class TriBulles {
public static void main(String[] args) {
int[] t = {5, 1, 4, 2};
for (int passe = 0; passe < t.length - 1; passe++) {
for (int j = 0; j < t.length - 1 - passe; j++) {
if (t[j] > t[j + 1]) {
int tmp = t[j];
t[j] = t[j + 1];
t[j + 1] = tmp;
}
}
}
System.out.println(Arrays.toString(t));
}
}
length, length() ou size() ?
| Objet | Taille | Exemple |
| tableau | length (attribut, sans parenthèses) | t.length |
String | length() (méthode) | mot.length() |
ArrayList | size() (méthode) | liste.size() |