"Rishi, j'ai vraiment hâte d'apprendre le reste des méthodes de la classe Arrays.

"Un tel zèle pour apprendre ne peut que plaire à votre ancien professeur ! Mais, si vous voulez vraiment tout savoir, un gentil sorcier nommé Google vous aidera jour et nuit."

"Euh..."

"Je plaisante. En quelque sorte. Bien sûr, j'expliquerai tout mieux, mais si quelque chose se passe - rappelez-vous le bon sorcier. Je commencerai la leçon d'aujourd'hui avec la Arrays.fillméthode

"Lorsqu'ils travaillent avec des tableaux, les programmeurs Java ont très souvent besoin de remplir le tableau avec la même valeur. Vous pouvez, bien sûr, écrire une boucle et simplement attribuer une valeur à chaque cellule du tableau dans la boucle :

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

"Ou au lieu de tout cela, vous pouvez appeler la Arrays.fill()méthode, qui fait exactement la même chose : elle remplit le tableau passé avec la valeur passée. Voici à quoi ça ressemble :

Arrays.fill(name, value)

Et le code de l'exemple ci-dessus peut être rendu un peu plus compact et plus clair :

int[] x = new int[100];
Arrays.fill(x, 999);

"Beau!"

"Vous pouvez également utiliser la Arrays.fill()méthode pour remplir non pas tout le tableau, mais une partie de celui-ci, avec une certaine valeur :

Arrays.fill(name, first, last, value)

"Où premier et dernier sont les indices des première et dernière cellules à remplir.

" Conformément à la bonne (ou mauvaise) vieille tradition de Java, rappelez-vous que le dernier élément n'est pas inclus dans la gamme.

Exemple:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);

Nous remplissons les cellules x[3], x[4], x[5]et x[6]avec la valeur 999. Les cellules d'un tableau sont numérotées à partir de zéro !

La strvariable contient la valeur
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

"La Arrays.fill()méthode ne fonctionne qu'avec des tableaux unidimensionnels. Si vous transmettez un tableau bidimensionnel à la méthode, il sera traité comme unidimensionnel, avec toutes les conséquences qui en découlent.

Arrays.copyOf()

"Amigo, s'il vous plaît, dites-moi comment modifier la taille d'un tableau après sa création ?"

"Hum... C'est une question piège, n'est-ce pas ? Je ne suis plus si inexpérimenté. La bonne réponse est que vous ne pouvez pas ! Vous ne pouvez pas redimensionner un tableau après qu'il a été créé."

"Mais et si tu le voulais vraiment ?"

"C'est encore impossible !

« En fait, si vous le voulez vraiment, alors vous pouvez ! À l'aide d'une astuce de programmation :

  1. Tout d'abord, vous créez un nouveau tableau de la longueur souhaitée
  2. Ensuite, vous copiez tous les éléments du premier tableau dans celui-ci.

"Ce sont les deux choses que Arrays.copyOf()fait la méthode. Voici à quoi ressemble son appel :

Type[] name2 = Arrays.copyOf(name, length);

"Cette méthode ne modifie pas le tableau existant , mais crée à la place un nouveau tableau et y copie les éléments de l'ancien tableau."

"Et si la longueur du nouveau tableau est inférieure à la longueur de l'existant ?

"Excellente question, Amigo ! Si les éléments ne correspondent pas, les valeurs supplémentaires sont tout simplement ignorées."

« Et si, au contraire, il y a des cellules supplémentaires, quelles sont leurs valeurs initiales ?

"Si la longueur du nouveau tableau est supérieure à la longueur de l'ancien, les cellules sont remplies de zéros.

Exemple:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


La str2variable contient la valeur La variable contient la valeur
"[1, 2, 3, 4, 5]"

str3
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

Arrays.copyOfRange()

"Et si vous voulez obtenir un tableau de longueur 5 à partir d'un tableau de longueur 10, mais que vous avez besoin qu'il contienne les 5 derniers éléments plutôt que les 5 premiers ? Dans ce cas, vous avez besoin d'une autre méthode de la classe. ArraysC'est Arrays.copyOfRange(). Voici à quoi ressemble l'appel :

Type[] name2 = Arrays.copyOfRange(name, first, last);

"Cette méthode crée également un nouveau tableau, mais le remplit avec des éléments d'un endroit arbitraire dans le tableau d'origine. Où premier et dernier sont les indices des premier et dernier éléments qui doivent être placés dans le nouveau tableau. Pouvez-vous me dire si le dernier élément est inclus dans cette plage ?"

"Ha ! Comme disait mon grand professeur, ' conformément à la bonne (ou mauvaise) vieille tradition de Java, rappelez-vous que le dernier élément n'est pas inclus dans la gamme '."

"Amigo, tu grandis sous nos yeux.

Exemple:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


La str2variable contient la valeur La variable contient la valeur
"[16, 17, 18, 19, 20]"

str3
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"

Arrays.sort()

"Et enfin, j'ai laissé la méthode la plus... mmm... agréable pour la fin : le tri . Les tableaux sont triés assez souvent en programmation. Voici les 3 actions les plus populaires lorsque l'on travaille avec des tableaux :

  • Trier un tableau
  • Trouver l'élément minimum (ou maximum) d'un tableau
  • Détermination de l'index d'un élément dans un tableau (trouver un élément dans un tableau)

"Je dois dire que les algorithmes de tri performants ne sont pas si faciles à écrire. Plus précisément, il s'agit d'une tâche standard, et en tant qu'étudiant, cela ne vous fera pas de mal de vous entraîner parfois à écrire des algorithmes de tri. Mais au travail, c'est mieux vaut ne pas perdre votre temps à réinventer la roue. Les créateurs de Java ont inclus la sort()méthode dans la Arraysclasse. Voici à quoi ressemble son appel :

Arrays.sort(name);

Cette méthode trie le tableau passé dans l'ordre croissant.

Exemple:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);
String str = Arrays.toString(x);


La strvariable contient la valeur
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

"Excellent ! J'ai appelé une seule méthode et le tableau est trié. Une chose de toute beauté !"

"Au fait, vous pouvez trier non seulement l'intégralité du tableau, mais également une partie de celui-ci. Voici à quoi ressemble l'appel :

Arrays.sort(name, first, last);

"Où premier et dernier sont les indices des première et dernière cellules que le tri doit toucher. ET…

"Je sais déjà ce que vous allez dire ! 'Conformément à la bonne (ou mauvaise) vieille tradition de Java, rappelez-vous que le dernier élément n'est pas inclus dans la gamme' .

Exemple:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


La strvariable contient la valeur
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

"Pour trier les tableaux, Java utilise l'algorithme de tri le plus rapide - QuickSort . Sa complexité de calcul dépend de la taille du tableau et est calculée à l'aide de la formule N log(N).

"Le tri d'un tableau de 1000 éléments impliquera environ 10 000 comparaisons d'éléments de tableau. Le tri d'un tableau d'un million d'éléments impliquera environ 20 millions de comparaisons."

" Pas trop de comparaisons quand on considère le nombre d'éléments !"

"C'est exactement ce que je dis. L' algorithme QuickSort est très efficace.

Arrays.binarySearch()

"Eh bien, et la dernière des méthodes les plus intéressantes de la Arraysclasse est capable de rechercher une valeur donnée dans un tableau. Ce n'est pas une recherche ordinaire - c'est la recherche binaire bien-aimée . Cela se résume à ceci :

  • Tout d'abord, le tableau est trié.
  • Ensuite, l'élément du milieu du tableau est comparé à celui que nous recherchons.
  • Si l'élément est supérieur à l'élément du milieu, la recherche se poursuit dans la moitié droite du tableau.
  • Si l'élément que nous recherchons est inférieur à l'élément du milieu, la recherche se poursuit dans la moitié gauche du tableau.

"Parce que le tableau est trié, il est possible d'en éliminer la moitié en une seule comparaison. Ensuite, à l'étape suivante, nous en éliminons une autre moitié, et ainsi de suite."

« Fantastique ! Nous allons droit au but très rapidement ! »

"Exactement. Dans un tableau d'un million (!) d'éléments, l'algorithme de recherche binaire peut trouver l'index de l'élément souhaité en seulement 20 comparaisons. Le défaut de l'algorithme est que le tableau doit d'abord être trié, et le tri prend également du temps.

Voici à quoi ressemble l'appel :

int index = Arrays.binarySearch(name, value);

"Où nameest le nom du tableau, qui doit être passé déjà trié (par exemple, en utilisant la Arrays.sort()méthode). Et valueest l'élément que nous recherchons dans le tableau. Le résultat renvoyé par la méthode est l' index de l'élément du tableau souhaité .

Exemples:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xest
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(les indices 0et 2sont également acceptables)
8
-7

"Et si l'élément souhaité apparaît plusieurs fois dans le tableau ?"

"C'est une question valable, Amigo. Dans ce cas, l'algorithme renverra l'index de l'un d'entre eux (il n'y a aucune garantie que ce sera, disons, le tout premier, ou vice versa - le tout dernier de ces éléments en double) ."

"Et si le tableau ne contient pas du tout l'élément souhaité ?"

"Dans ce cas, l'algorithme renverra un index négatif .

Documentation

"Tout est clair, Rishi ! C'était très intéressant."

"Si vous avez vraiment trouvé cela très intéressant, alors parcourez à loisir la documentation officielle de la Arraysclasse et de ses méthodes sur le site Web d'Oracle .

"Vous pouvez regarder de plus près, par exemple, les méthodes Arrays.mismatch()et Arrays.compare(). Vous pourrez très probablement les utiliser à bon escient.

"Et ne soyez pas confus par le nombre de méthodes. Chaque méthode a 5 à 10 variantes, qui ne diffèrent que par leurs types de paramètres."