Aller au contenu principal

Module Dart.6 – Collections

Objectif

Maîtriser toutes les collections Dart : List, Map, Set et leurs méthodes pour manipuler efficacement les données.

Théorie

List

Liste ordonnée d'éléments, peut contenir des doublons.

Création

// Littéral
List<int> nombres = [10, 20, 30];
List<String> noms = ['Jean', 'Marie', 'Pierre'];
List<dynamic> mixte = [1, 'texte', true];

// Constructeur
List<int> vide = [];
List<int> avecTaille = List.filled(5, 0); // [0, 0, 0, 0, 0]
List<int> generate = List.generate(5, (i) => i * 2); // [0, 2, 4, 6, 8]

Accès et modification

List<int> nombres = [10, 20, 30];

nombres[0]; // 10 (premier élément, index 0)
nombres[1] = 25; // Modifie le deuxième élément
nombres.length; // 3
nombres.first; // 10
nombres.last; // 30

Ajout et suppression

List<int> nombres = [10, 20];

nombres.add(30); // Ajoute à la fin : [10, 20, 30]
nombres.addAll([40, 50]); // Ajoute plusieurs : [10, 20, 30, 40, 50]
nombres.insert(0, 5); // Insère à l'index 0 : [5, 10, 20, ...]

nombres.remove(20); // Retire la première occurrence de 20
nombres.removeAt(0); // Retire l'élément à l'index 0
nombres.removeLast(); // Retire le dernier
nombres.clear(); // Vide la liste

Méthodes de transformation

map : Transforme chaque élément

var doubles = nombres.map((n) => n * 2).toList();

where : Filtre les éléments

var pairs = nombres.where((n) => n % 2 == 0).toList();

forEach : Exécute une fonction pour chaque élément

nombres.forEach((n) => print(n));

reduce / fold : Réduit à une valeur

var somme = nombres.reduce((a, b) => a + b);
var produit = nombres.fold(1, (acc, n) => acc * n);

Méthodes de recherche

nombres.contains(20);         // true
nombres.indexOf(20); // 1 (première occurrence)
nombres.lastIndexOf(20); // Dernière occurrence
nombres.firstWhere((n) => n > 15); // Premier élément > 15
nombres.any((n) => n > 25); // true si au moins un > 25
nombres.every((n) => n > 0); // true si tous > 0

Tri et manipulation

nombres.sort();                    // Trie en place
nombres.reversed.toList(); // Inverse (nouvelle liste)
nombres.shuffle(); // Mélange
nombres.sublist(1, 3); // Sous-liste [1, 3[

Map

Structure clé-valeur pour stocker des paires.

Création

// Littéral
Map<String, int> ages = {
'Jean': 30,
'Marie': 25,
'Pierre': 35
};

// Constructeur
Map<String, int> vide = {};
Map<String, int> autre = Map();

Accès et modification

ages['Jean'];              // 30
ages['Inexistant']; // null
ages['Nouveau'] = 28; // Ajoute ou modifie
ages.remove('Jean'); // Retire la paire
ages.clear(); // Vide
ages.length; // Nombre de paires

Vérifications

ages.containsKey('Jean');   // true
ages.containsValue(30); // true
ages.isEmpty; // false
ages.isNotEmpty; // true

Parcourir

// Par clés
for (String nom in ages.keys) {
print('$nom: ${ages[nom]}');
}

// Par valeurs
for (int age in ages.values) {
print(age);
}

// Par paires
for (var entry in ages.entries) {
print('${entry.key}: ${entry.value}');
}

// forEach
ages.forEach((nom, age) {
print('$nom: $age');
});

Set

Collection de valeurs uniques (pas de doublons).

Création

// Littéral
Set<String> noms = {'Jean', 'Marie', 'Pierre'};
Set<int> nombres = {1, 2, 3, 3, 4}; // {1, 2, 3, 4} (doublons retirés)

// Constructeur
Set<String> vide = {};
Set<int> autre = Set();

Utilisation

Set<String> noms = {'Jean', 'Marie'};

noms.add('Pierre'); // Ajoute
noms.add('Jean'); // Ignoré (déjà présent)
noms.remove('Jean'); // Retire
noms.contains('Marie'); // true
noms.length; // 2
noms.clear(); // Vide

Opérations ensemblistes

Set<int> set1 = {1, 2, 3};
Set<int> set2 = {3, 4, 5};

set1.union(set2); // {1, 2, 3, 4, 5}
set1.intersection(set2); // {3}
set1.difference(set2); // {1, 2}

Comparaison des collections

List : Ordre garanti, doublons autorisés, accès par index Map : Clé-valeur, accès rapide par clé Set : Valeurs uniques, pas d'ordre garanti (sauf LinkedHashSet)

Exercice

  1. List

    • Créez et manipulez des listes
    • Utilisez map, where, forEach
    • Testez toutes les méthodes
  2. Map

    • Créez des maps
    • Stockez et récupérez des valeurs
    • Parcourez avec différentes méthodes
  3. Set

    • Retirez les doublons d'une liste
    • Testez les opérations ensemblistes
    • Utilisez pour vérifier l'appartenance
  4. Méthodes avancées

    • Utilisez reduce, fold
    • Testez firstWhere, where
    • Comprenez les différences
  5. Choix de collection

    • Identifiez la meilleure collection pour différents cas
    • Justifiez vos choix
    • Testez les performances

Quiz

  1. Quelle méthode transforme chaque élément d'une liste ?

    • where
    • map
    • reduce
  2. Que fait Set en Dart ?

    • Trie les éléments
    • Stocke des valeurs uniques
    • Permet les doublons
  3. Comment accéder à une valeur dans une Map ?

    • map.get('cle')
    • map['cle']
    • map.value('cle')
  4. Que fait where() sur une liste ?

    • Transforme les éléments
    • Filtre les éléments
    • Trie les éléments
  5. Comment retirer les doublons d'une liste ?

    • list.unique()
    • list.toSet().toList()
    • list.removeDuplicates()

Mini défi

Mission : Créer un système de gestion de données complet

Créez un système qui gère une collection de produits :

Données :

class Produit {
int id;
String nom;
double prix;
int stock;
String categorie;
}

Fonctionnalités :

  1. Recherche par nom, ID, catégorie
  2. Tri par prix, stock, nom
  3. Calculs (prix moyen, total stock)
  4. Filtres (stock > 0, prix < seuil)
  5. Groupement par catégorie (utilisez Map)

Critères :

  • ✅ Utilisation de List, Map, Set appropriés
  • ✅ Méthodes de collection (map, where, etc.)
  • ✅ Code organisé
  • ✅ Performance optimisée

Objectif : Maîtriser toutes les collections Dart et savoir choisir la bonne pour chaque situation.


Validation : Vous pouvez passer au module suivant quand vous maîtrisez List, Map, Set et pouvez les utiliser efficacement.