## Tableaux
Les tableaux permettent de stocker un **nombre fixe** de données
Ils sont indexés à partir de 0.
![[dev-java-array-structure.png|360x150]]
Source : https://dev.java/learn/language-basics/arrays/
```java
String[] strings = new String[]{"Foo", "Bar",};
// Syntaxe compacte
String[] otherStrings = {"Foo", "Bar",};
String foo = strings[0]; // -> "Foo"
strings[1] = "bar";
strings[10] = "bar"; // -> ArrayIndexOutOfBoundsException
int[] array = new int[10];
int[] numbers = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
String[] texts; // -> null
```
### A plusieurs dimensions
```java
int[][] array2D = new int[][]{
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25},
};
int number = array2D[2][3];
// 14
```
<div style="page-break-after: always;"></div>
### Parcourir un tableau
Avec une boucle classique
```java
int[] numbers = {10, 20, 30, 40, 50};
for (int i = 0; i < numbers.length; i++) {
int number = numbers[i];
System.out.println("Indice " + i + " : " + number);
}
```
Avec une boucle améliorée
```java
int[] numbers = {10, 20, 30, 40, 50};
for (int number : numbers) {
System.out.println("Nombre : " + number);
}
```
```java
String[] couleurs = {"bleu", "vert", "rouge"};
for (String couleur : couleurs) {
System.out.println("Couleur : " + couleur);
}
```
### Utilitaires `Arrays`
```java
import java.util.Arrays;
```
```java
int[] numbers = new int[5];
Arrays.fill(numbers, 42);
```
Il existe plein d'autres fonctions utilitaires sur les tableaux.
```java
int[] array1 = new int[]{1, 2};
int[] array2 = new int[]{2, 2};
int comparison = Arrays.compare(array1, array2);
System.out.println(comparison);
// -1
// Cela signifie que le tableau 1 {1, 2}
// est inférieur au tableau 2 {2, 2}
```
<!--
- ``
- `Arrays.deepEquals(array2D,new int[][]{{1,2,3}});`
```
- Arrays.toString
- Arrays.sort
- Arrays.equals
- Arrays.compareTo
...
-->
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Arrays.html
<div style="page-break-after: always;"></div>
## Les collections Java
Pour aller au delà des tableaux, Java propose des collections implémentant la plupart des algorithmes classiques de structures de données.
Ces outils permettent de stocker, parcourir, et manipuler des ensembles d'objets.
C'est présenté dans l'API Java par une hiérarchie de types.
![[dev-java-collection-hierarchy.png|320x292]]
Source : https://dev.java/learn/api/collections-framework/organization/
Les collections contrairement aux tableaux ont des tailles dynamiques
Elles font partie du package Java.util et il faut les inclure au début du programme.
<div style="page-break-after: always;"></div>
## `List`
Une `List` est une collection qui permet l'accès et la modification indexée de ses éléments.
`List`est compatible avec `Iterable` et `Collection`.
Elle possède de nombreuses méthodes permettant l'accès et la modification **indexée** (position de l'objet dans la liste).
```java
List<String> list = new ArrayList<String>();
list.addAll(1,collection);
String elementALindex1 = list.get(1);
list.set(1,"A");
int indexOfA = list.indexOf("A");
int lastIndexOfA = list.lastIndexOf("A");
List<String> sousListe = list.subList(0, 2);
```
C'est un [[Glossaire - Programmation#Type générique|type générique]]. C'est à dire qu'il faut indiquer le type de données qu'elle contient en l'indiquant entre `< >`.
Ex.
```java
// Liste de chaines de caractères
List<String> textes = new ArrayList<String>();
// Liste de nombre entiers
List<Integer> entiers = new ArrayList<Integer>();
```
> [!danger] Ne fonctionne qu'avec les types référence
>
> Le code suivant ne compile pas :
> ```java
> List<int> entiersPrimitifs = new ArrayList<int>();
> ```
>
> Il faut écrire le code suivant à la place :
> ```java
> List<Integer> entiersReference = new ArrayList<Integer>();
> ```
>
<div style="page-break-after: always;"></div>
### `ArrayList`
Une `ArrayList` est une `List` qui permet de stocker une liste d’objets de [[Glossaire - Programmation#Type référence (Java)|type référence]] (dont des valeurs `null`).
`ArrayList` est **modifiable**.
Une `ArrayList` possède de nombreuses méthodes permettant l'accès et la modification **indexée** (position de l'objet dans la liste).
**Contrairement aux tableaux**, sa taille est variable.
```java
import java.util.ArrayList;
```
```java
List<String> chasseurs = new ArrayList<String>() ;
chasseurs.add("Bébert");
chasseurs.add("Robert");
chasseurs.add("Gérard");
System.out.println(chasseurs); // [Bébert, Robert, Gérard]
// Ajout en index 3
chasseurs.add(2,"Dédé");
System.out.println(chasseurs); // [Bébert, Robert, Dédé, Gérard]
// Remplacement en index 3
chasseurs.set(2,"André");
System.out.println(chasseurs); // [Bébert, Robert, André, Gérard]
```
Autres façons de déclarer une `ArrayList` dans une variable
```java
Collection<String> names = new ArrayList<>() ;
List<String> names = new ArrayList<>() ;
var names = new ArrayList<String>() ;
// Non recommandé, utiliser plutôt un type plus faible
ArrayList<String> names = new ArrayList<String>() ;
```
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/ArrayList.html
### `List` non modifiable
```java
List<String> chasseurs;
chasseurs= List.of("Bébert", "Robert", "Gérard");
chasseurs=Collections.EMPTY_LIST;
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Bébert");
chasseurs=Collections.unmodifiableList(arrayList);
```
<div style="page-break-after: always;"></div>
## `Set`
Le type `Set` correspond à une collection dont **chaque élément est unique**.
`Set`est compatible avec `Iterable` et `Collection`.
Quelques types compatibles avec `Set`
```java
Set<String> set;
set = new HashSet<>();
set = new TreeSet<>();
set = new LinkedHashSet<>();
```
### `HashSet`
HashSet est une implémentation de `Set` qui détermine l'unicité de ses éléments par sa valeur (et par le résultat de la méthode `hashcode()` de l'objet contenu.
```java
Set<String> chasseurs = new HashSet<>() ;
chasseurs.add("Bébert");
chasseurs.add("Robert");
chasseurs.add("Gérard");
chasseurs.add("Gérard");
chasseurs.add("Gérard");
chasseurs.add("Gérard");
System.out.println(chasseurs); // [Gérard, Robert, Bébert]
// Pas d'ordre particulier
```
```java
Set<String> chasseurs = new LinkedHashSet<>() ;
chasseurs.add("Bébert");
chasseurs.add("Robert");
chasseurs.add("Gérard");
chasseurs.add("Gérard");
System.out.println(chasseurs); // [Bébert, Robert, Gérard]
// Dans l'ordre d'apparition
```
<div style="page-break-after: always;"></div>
### `TreeSet`
`TreeSet` est un set basé sur une structure d'arbre qui trie des éléments comparables dans l'ordre naturel (déterminé par leur méthode `compareTo()`)
```java
Set<String> chasseurs = new TreeSet<>() ;
chasseurs.add("Bébert");
chasseurs.add("Robert");
chasseurs.add("Gérard");
chasseurs.add("Gérard");
System.out.println(chasseurs); // [Bébert, Gérard, Robert]
// Dans l'ordre naturel (ici alphabétique)
```
`TreeSet`est compatible avec le type `SortedSet`.
```java
SortedSet<String> treeSet = new TreeSet<>();
```
### `Set` non modifiable
```java
Set<String> chasseurs;
chasseurs = Set.of("Bébert", "Robert", "Gérard");
chasseurs = Collections.EMPTY_SET;
HashSet<String> hashSet = new HashSet<>();
hashSet.add("A");
chasseurs = Collections.unmodifiableSet(hashSet);
```
<div style="page-break-after: always;"></div>
## `Queue`
File d'attente.
Est compatible avec le type `Collection`
Quelques types compatibles
```java
Queue<String> queue;
queue= new PriorityQueue<>();
queue= new LinkedList<>();
queue= new ArrayDeque<>();
```
![[collections-queue-methods.png|335x154]]
```java
queue.add("A");
queue.offer("B");
String head = queue.remove();
head = queue.poll();
head = queue.peek();
head = queue.element();
```
<div style="page-break-after: always;"></div>
## `Deque`
Une collection linéaire qui prend en charge **l'insertion et la suppression** d'éléments **aux deux extrémités**.
Le nom deque est l'abréviation de "double file d'attente" en anglais et se prononce généralement "deck".
Est compatible avec le type `Collection` et `Queue`
Résumé des méthodes de `Deque`
![[collections-deque-method-summary.png|421x136]]
Quelques types compatibles avec `Deque`
```java
Deque<String> deque;
deque=new LinkedList<>();
deque=new ArrayDeque<>();
deque=new ConcurrentLinkedDeque<>();
deque=new LinkedBlockingDeque<>();
```
Comparaison entre `Queue` et `Deque`
![[collections-deque-queue-methods.png|304x249]]
Exemples de quelques méthodes de deque
```java
Deque<String> deque = new LinkedList<>();
deque.push("A");
String popped = deque.pop();
String first = deque.peekFirst();
String last = deque.peekLast();
deque.offerFirst("A");
deque.offerLast("A");
String first1 = deque.pollFirst();
String last1 = deque.pollLast();
deque.removeFirstOccurrence("A");
deque.removeLastOccurrence("B");
```
<div style="page-break-after: always;"></div>
## Parcourir une collection : boucle foreach
```java
Map<Integer,String> nombresRomains = Map.of(
1,"I",
2,"II",
3,"III",
4,"IV",
5,"V");
for (Integer nombreArabe : nombresRomains.keySet()){
System.out.println(nombreArabe+" : "+nombresRomains.get(nombreArabe));
}
// 1 : I
// 2 : II
// 3 : III
// 4 : IV
// 5 : V
for (String nombreRomain : nombresRomains.values()){
System.out.println(nombreRomain);
}
// I
// II
// III
// IV
// V
Collection<String> chasseurs = new HashSet<>() ;
chasseurs.add("Bébert");
chasseurs.add("Robert");
chasseurs.add("Gérard");
for (String chasseur : chasseurs){
System.out.println(chasseur);
}
// Bébert
// Robert
// Gérard
Collection<String> chasseurs = new ArrayList<>() ;
chasseurs.add("Bébert");
chasseurs.add("Robert");
chasseurs.add("Gérard");
for (String chasseur : chasseurs){
System.out.println(chasseur);
}
// Bébert
// Robert
// Gérard
```
<div style="page-break-after: always;"></div>
## Revenons à `Iterable` et `Collection`
Comme nous l'avons vu plus haut, les collections `Set`, `List` sont compatibles avec les types `Iterable` et `Collection`
![[dev-java-collection-hierarchy.png|320x292]]
Cela signifie qu'il bénéficient des fonctionnalités de ces types.
### Type `Iterable`
Indique que la collection peut être **parcourue à l'aide d'une boucle améliorée**.
Ex.
```java
Iterable<String> monIterable;
monIterable = new ArrayList<String>();
monIterable = List.of("A","B","C");
monIterable = new HashSet<String>();
monIterable = Set.of("A","B","C");
for (String valeur : monIterable){
IO.println(valeur);
}
```
Voir : https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Iterable.html
<div style="page-break-after: always;"></div>
### Type `Collection`
Ce type est généralement utilisée pour transmettre des collections et les manipuler là où une généralité maximale est souhaitée.
`Collection` est compatible avec `Iterable`. Cela sgnifie qu'on peut également utiliser la boucle for améliorée avec une variable de type `Collection`.
Voici des fonctionnalités présentes dans le type `Collection`
- `add(element)`
- `addAll(collection)`
- `clear()`
- `contains(objet)`
- `containsAll(collection)`
- `isEmpty()`
- `remove(objet)`
- `removeAll(collection)`
- `removeIf(filtre)`
- `size()`
- `stream()`
- `toArray()`
Voir : https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Collection.html
```java
Collection<String> maCollection;
maCollection = new ArrayList<String>();
maCollection = new HashSet<String>();
maCollection.add("A");
maCollection.remove("A");
maCollection = List.of("A","B","C");
maCollection = Set.of("A","B","C");
// Les listes non modifiables (List.of(), Set.of())
// Ne peuvent pas être modifiées
maCollection.add("A"); // -> UnsupportedOperationException
maCollection.remove("A"); // -> UnsupportedOperationException
```
<div style="page-break-after: always;"></div>
## `Map`
Le type `Map` correspond à un **dictionnaire** clé-valeur.
> [!danger]
> `Map` **N'EST PAS compatible** avec le type `Collection` ni avec `Iterable`.
### `HashMap`
`HashMap` en est une implémentation de `Set` dont les clés sont basées sur une `HashMap`.
HashMap est modifiable.
```java
Map<Integer,String> nombresRomains = new HashMap<>();
nombresRomains.put(1,"I");
nombresRomains.put(2,"II");
nombresRomains.put(3,"III");
nombresRomains.put(4,"IV");
nombresRomains.put(5,"V");
nombresRomains.get(2);
// "II"
nombresRomains.remove(3);
nombresRomains.size();
```
### `Map` non modifiable
```java
Map<Integer,String> nombresRomains;
nombresRomains= Map.of(
1,"I",
2,"II",
3,"III",
4,"IV",
5,"V");
nombresRomains= Collections.EMPTY_MAP;
HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(1,"I");
nombresRomains= Collections.unmodifiableMap(hashMap);
```
<div style="page-break-after: always;"></div>
## Utilitaires `Collections`
Utilitaires pour les collections
```java
List<String> list = new ArrayList<>(List.of("Bébert","Dédé","Gérard"));
Collections.shuffle(list);
Collections.sort(list);
Collections.max(list);
// ...
```
# À suivre
[[3.1 - Fondamentaux de la Programmation Orientée Objet]]