Les Ensembles

Les Ensembles

> LeekScript

Un ensemble (set) est une collection de valeurs uniques. Il vaut mieux le voir comme un sac de valeurs distinctes que comme une liste : on ne lui demande pas « quel est le 3ᵉ élément ? », mais plutôt « est-ce que telle valeur est dedans ? ».

Deux propriétés le définissent :

C'est ce qui le distingue d'un tableau (Array), qui accepte les doublons et se manipule par indices.

---

Quand choisir un ensemble plutôt qu'un tableau ?

Posez-vous une seule question : « ai-je besoin de savoir rapidement si une valeur est présente, ou d'éviter les doublons ? »

Ce coût constant est l'argument décisif : dans un tableau, vérifier la présence d'une valeur oblige à le parcourir, ce qui coûte autant d'opérations qu'il contient d'éléments. Dans un combat où les opérations sont limitées, l'ensemble fait toute la différence dès qu'on teste souvent l'appartenance.

Exemples typiques : mémoriser les cellules déjà visitées, garder la liste des ennemis repérés sans risquer de les compter deux fois, ou comparer deux zones du terrain.

---

Créer un ensemble

On peut écrire un ensemble en toutes lettres avec des chevrons ``, mais en pratique on part souvent d'un ensemble vide que l'on remplit au fil du programme.

L'opérateur .. permet de générer une plage de valeurs sans tout énumérer :

On peut aussi créer un ensemble avec new Set(), ou en convertir un tableau ou un intervalle :

Comme un ensemble refuse les doublons, ceux-ci disparaissent dès la construction. L'ordre d'insertion, lui, est conservé :

Typage

Un ensemble peut être typé selon son contenu :

| Type | Contenu | |-----------------|-------------------------------| | Set | uniquement des entiers | | Set | uniquement des nombres réels | | Set | n'importe quel type de valeur |

Le paramètre de type peut être n'importe quel type : Set, Set, Set

---

Remplir et vider un ensemble

setPut(set, element)booléen ajoute une valeur. Sa valeur de retour est souvent plus utile que l'ajout lui-même : elle vaut true si l'élément était nouveau, false s'il existait déjà. C'est parfait pour détecter une première rencontre.

setRemove(set, element)booléen retire une valeur et renvoie true si elle était présente, false sinon — pratique pour agir uniquement quand l'élément existait vraiment.

setClear(set)set vide complètement l'ensemble, par exemple pour le réutiliser au tour suivant.

---

Interroger un ensemble

C'est ici que l'ensemble prend tout son sens.

Pour savoir si une valeur est présente, l'opérateur in est la forme la plus courte : element in set renvoie un booléen. La fonction setContains(set, element) fait exactement la même chose, au même coût, si vous préférez la notation fonction.

setSize(set)entier donne le nombre d'éléments, et setIsEmpty(set)booléen indique s'il est vide (plus lisible que setSize(s) == 0).

---

Combiner et filtrer des ensembles

Les ensembles permettent de raisonner sur des groupes de valeurs. Ces fonctions prennent deux ensembles et renvoient un nouvel ensemble (ou un booléen) sans modifier les originaux. C'est souvent beaucoup plus simple que d'écrire des boucles à la main.

setFilter(set, callback)set construit quant à lui un nouvel ensemble en ne gardant que les éléments pour lesquels le callback renvoie true :

---

Parcourir et convertir

Un ensemble se parcourt avec une boucle for ... in. Depuis la version 2.48, les éléments sont parcourus dans leur ordre d'insertion, toujours le même d'une exécution à l'autre.

Si vous avez besoin d'un autre ordre, convertissez d'abord l'ensemble en tableau avec setToArray(set)array, puis triez ce tableau.

---

Exemple complet

---

Aide-mémoire

| Élément | Retour | Rôle | |----------------------------|-----------|-----------------------------------------------| | x in s | booléen | Présence de xcoûte 1 opération | | setContains(s, x) | booléen | Présence de x (même coût que in) | | setPut(s, x) | booléen | Ajoute x ; true si nouveau | | setRemove(s, x) | booléen | Retire x ; true si présent | | setClear(s) | set | Vide l'ensemble | | setSize(s) | entier | Nombre d'éléments | | setIsEmpty(s) | booléen | true si l'ensemble est vide | | setToArray(s) | array | Convertit en tableau (ordre d'insertion) | | arrayToSet(t) | set | Convertit un tableau en ensemble | | intervalToSet(i) | set | Convertit un intervalle en ensemble | | setFilter(s, f) | set | Garde les éléments validés par le callback | | setUnion(s1, s2) | set | A ∪ B | | setIntersection(s1, s2) | set | A ∩ B | | setDifference(s1, s2) | set | A \ B | | setDisjunction(s1, s2) | set | Différence symétrique A △ B | | setIsSubsetOf(s1, s2) | booléen | true si A ⊆ B |