Ce face Set.identity
Un set obișnuit consideră egale două obiecte dacă == spune asta. Set.identity() folosește în schimb identical: două obiecte diferite rămân două elemente chiar dacă au aceleași date.
Este util când vrei să ții evidența obiectelor deja procesate (de exemplu la parcurgerea unui graf), indiferent cum este definită egalitatea lor.
Ce returnează
Un set gol, care păstrează ordinea inserării și compară cu identical.
Exemple
Exemplul 1: Egalitate față de identitate
class Punct {
final int x, y;
Punct(this.x, this.y);
@override
bool operator ==(Object other) => other is Punct && other.x == x && other.y == y;
@override
int get hashCode => Object.hash(x, y);
}
void main() {
final a = Punct(1, 2);
final b = Punct(1, 2);
final normal = {a, b};
final dupaIdentitate = Set<Punct>.identity()..addAll([a, b, a]);
print('set obișnuit: ${normal.length} element');
print('Set.identity: ${dupaIdentitate.length} elemente');
}
Rezultat
set obișnuit: 1 element
Set.identity: 2 elemente
Exemplul 2: Obiecte deja vizitate
class Nod {
final String nume;
final List<Nod> vecini = [];
Nod(this.nume);
}
void main() {
final iasi = Nod('Iași');
final vaslui = Nod('Vaslui');
final bacau = Nod('Bacău');
iasi.vecini.addAll([vaslui, bacau]);
vaslui.vecini.addAll([iasi, bacau]);
bacau.vecini.addAll([iasi, vaslui]);
final vizitate = Set<Nod>.identity();
void viziteaza(Nod n) {
if (!vizitate.add(n)) return;
print('Vizitez ${n.nume}');
n.vecini.forEach(viziteaza);
}
viziteaza(iasi);
}
Rezultat
Vizitez Iași
Vizitez Vaslui
Vizitez Bacău
Greșeli frecvente
- Pui texte sau numere într-un
Set.identity()și te aștepți la comportamentul obișnuit. Pentru ele, identitatea poate fi diferită de egalitate; folosește un set normal.
Comenzi înrudite
Set: Colecție fără elemente duplicate: fiecare valoare apare o singură dată, iar căutarea este rapidă.identical: Verifică dacă două variabile arată spre exact același obiect din memorie, nu doar spre obiecte egale.LinkedHashSet: Set care păstrează ordinea inserării; este tipul implicit al seturilor scrise cu acolade.Set.lookup: Returnează elementul din set egal cu valoarea dată (obiectul păstrat în set), sau null dacă nu există.