JavaRush /Blog Java /Random-FR /Classe Arrays et son utilisation

Classe Arrays et son utilisation

Publié dans le groupe Random-FR
Bonjour à nouveau! :) Dans la dernière leçon, nous nous sommes familiarisés avec une structure de données telle qu'un tableau (tableau Java), avons appris à créer des tableaux, à les remplir de données et avons également appris comment ils sont stockés en mémoire. Aujourd'hui, nous examinerons quelques tâches et exemples de travail avec des tableaux que vous rencontrerez souvent dans un travail réel. Par exemple, imaginez cette situation : nous avons un tableau de 10 nombres écrits dans un ordre aléatoire.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Notre tâche est de trier ce tableau par ordre croissant : du plus petit au plus grand nombre. Au final, cela devrait ressembler à ceci :
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Comment faisons-nous cela? La tâche n'est pas anodine, nous n'avons jamais fait ça auparavant :/ Des idées ? Essaie de deviner. Voici ce que nous pouvons faire, par exemple :
  • Parcourez tous les éléments du tableau. Comparez chaque élément avec le suivant ( [0]avec [1], [1]avec [2], [2]avec , [3]etc.). Si l'élément actuel du tableau est plus grand que le suivant, nous les échangeons et passons à l'élément suivant. Sinon, laissez-le tel quel et continuez.

  • Ainsi, après le premier passage dans les éléments du tableau, la plus grande valeur (167) est garantie d'être dans la dernière cellule.

  • Passons maintenant à nouveau en revue tous les éléments du tableau, en commençant par l'élément avec index [0], mais jusqu'à l'avant-dernier élément (le plus grand nombre est déjà à sa place) et faisons les mêmes comparaisons et échanges. 
    A la fin, dans l'avant-dernière cellule, nous aurons la deuxième valeur la plus élevée (99).

  • Répétons ce travail autant de fois que nous avons moins un élément dans le tableau.
Classe Arrays et son utilisation - 2L'idée nous est venue, il ne reste plus qu'à écrire le code. Il ressemblera à ceci:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs,
             if they are in the wrong order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Euh... Ça a l'air un peu compliqué -_- Même si le principe général de fonctionnement est clair, il faut écrire pas mal de code pour résoudre une tâche aussi simple en apparence. D'accord, peut-être que nous nous sommes simplement surestimés ? La tâche que nous avons entreprise est probablement trop difficile pour nous jusqu'à présent. Essayons de faire quelque chose de plus simple. Par exemple, prenons le même tableau de nombres.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Notre tâche est de copier son contenu dans un autre tableau.
int [] numbersCopy = new int[10];
Pensez à la manière dont vous procéderiez pour cela en utilisant les connaissances que vous possédez déjà sur les tableaux ? Vous pouvez, par exemple, parcourir un tableau numberset écrire ses éléments un par un dansnumbersCopy :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
Eh bien, nous l'avons plus ou moins fait ! Le problème semble avoir été résolu, mais encore une fois : s'il doit être exécuté souvent, le code comportera un tas de boucles identiques. En fait, ces problèmes et d'autres ont été résolus depuis longtemps par les créateurs de Java, et nous n'avons pas besoin de « réinventer la roue » et d'écrire du code pour notre propre solution.

Classe de tableaux Java

Une classe Java spéciale vous aidera à résoudre les problèmes typiques lorsque vous travaillez avec des tableaux - Arrays. Des méthodes ont été ajoutées à cette classe pour résoudre les problèmes les plus courants rencontrés par les programmeurs Java dans leur travail. Par exemple, la tâche de trier un tableau, pour laquelle nous avons nous-mêmes essayé de trouver des solutions, peut être résolue en une seule ligne :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
La méthode Arrays.sort()trie le tableau. De plus, l’algorithme qui y est intégré rend cela beaucoup plus efficace que le code que nous avons écrit. Sortie de la console :

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Attention : pour convertir le tableau en chaîne, nous avons utilisé une autre méthode de classe Arrays- Arrays.toString(). Les tableaux Java eux-mêmes ne remplacent pas le toString(). Alors si tu écris simplement
System.out.println(numbers.toString());
toString()la méthode de classe sera appelée Object. Dans le cas des tableaux, le résultat ressemblera à ceci :

[I@4554617c
Maintenant, nous n’entrerons pas dans les détails des raisons pour lesquelles la conclusion est ainsi ; l’essentiel est que ce n’est clairement pas ce dont nous avons besoin. Mais Arrays.toString() a fait ce que nous voulions. D'ailleurs, notre problème de copie est également facilement résolu en classe Arrays:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
À la méthode Arrays.copyOf(), nous transmettons notre tableau d'origine (à partir duquel nous devons copier les valeurs) et la longueur du nouveau tableau dans lequel nous copions les données. Dans ce cas, nous avons indiqué comme longueur numbers.length, car nous voulons copier l'intégralité du tableau. Si nous voulons copier uniquement les premiers éléments, nous pouvons spécifier une longueur plus petite pour le nouveau tableau :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Ici, nous avons spécifié que la longueur du nouveau tableau est de 4. Par conséquent, seuls les 4 premiers éléments numbersseront copiés dans le nouveau tableau. Sortie de la console :

[167, -2, 16, 99]
À propos, si vous devez copier une partie d'un tableau, mais pas depuis le début, mais « depuis le milieu », Arraysvous pouvez également le faire :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Conclusion:

[16, 99, 26, 92]
Les nombres des cellules deux ( inclus ) à six ( non inclus ) ont été copiés dans le nouveau tableau. De plus, nous devrons peut-être comparer deux tableaux entre eux. Tout comme pour la méthode toString(), les tableaux eux-mêmes ne remplacent pas la méthode equals(). Donc si on essaie de les comparer comme ceci :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
nous obtenons le résultat false. Object.equals()Après tout, la méthode qui compare les liens s'appellera . Et bien sûr, ils sont différents ! Mais nous devons comparer le contenu des tableaux, pas les liens. La classe Arrayscontient une méthode surchargée equals()qui fait exactement ce dont nous avons besoin :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Conclusion:

true
À propos, la classe Arraysfonctionne avec succès non seulement avec des tableaux ordinaires, mais également avec des tableaux bidimensionnels :
public class Main {

   public static void main(String[] args) {

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

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal to each other?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Conclusion:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Comme vous pouvez le voir, la méthode Arrays.copyOf()a permis de copier un tableau à deux dimensions. Veuillez noter que dans ce cas, lors de la copie d'un tableau à deux dimensions, une « copie superficielle » se produit. Et pour comparer des tableaux bidimensionnels et les afficher sur la console, des méthodes spéciales sont fournies - deepEqualset deepToString(); À l'avenir, vous verrez plus d'une fois (et vous en serez heureux) que les créateurs de Java ont prévu de nombreuses situations typiques que les programmeurs rencontrent lorsqu'ils travaillent et ont implémenté des solutions toutes faites pour elles dans le langage. Utiliser ces solutions est bien plus simple et pratique que de réinventer les roues, n’est-ce pas ? :) Assurez-vous de lire la documentation de la classe Arrayssur le site Web d'Oracle . Bonne chance dans tes études !
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION