Map în Dart

Colecție de perechi cheie–valoare: cauți rapid o valoare după cheia ei (nume, cod, oraș).

Sintaxă
abstract interface class Map<K, V>

Map<K, V>()
int get length
bool get isEmpty
bool get isNotEmpty

Ce face Map

Un Map<K, V> leagă fiecare cheie de tipul K de o valoare de tipul V. Cheile sunt unice: dacă pui din nou aceeași cheie, valoarea veche este înlocuită. Cel mai des creezi un map cu acolade: {'Ana': 10, 'Mihai': 8}.

Un map creat cu acolade sau cu Map() este de fapt un LinkedHashMap: păstrează ordinea în care au fost adăugate cheile, deci print și buclele îl parcurg mereu în aceeași ordine.

length spune câte perechi are map-ul, iar isEmpty și isNotEmpty verifică rapid dacă este gol.

Ce returnează

Constructorul Map() returnează un map gol, care păstrează ordinea inserării.

Exemple

Exemplul 1: Note la informatică

Cheia este numele elevului, valoarea este nota. Ordinea de afișare este ordinea în care au fost adăugați elevii.

void main() {
  final note = {'Ana': 10, 'Mihai': 8, 'Ioana': 9};
  print(note);
  print('Elevi: ${note.length}');

  note['Radu'] = 7;
  note['Mihai'] = 9;
  print(note);
  print('Nota Ioanei: ${note['Ioana']}');
}

Rezultat

{Ana: 10, Mihai: 8, Ioana: 9}
Elevi: 3
{Ana: 10, Mihai: 9, Ioana: 9, Radu: 7}
Nota Ioanei: 9

Exemplul 2: Map gol, length, isEmpty și isNotEmpty

void main() {
  final stoc = <String, int>{};
  print('gol: ${stoc.isEmpty}, lungime: ${stoc.length}');

  stoc['mere'] = 40;
  stoc['pere'] = 15;
  if (stoc.isNotEmpty) {
    print('Avem ${stoc.length} produse: $stoc');
  }

  final altul = Map<String, double>();
  altul['pâine'] = 4.5;
  print(altul);
}

Rezultat

gol: true, lungime: 0
Avem 2 produse: {mere: 40, pere: 15}
{pâine: 4.5}

Exemplul 3: Numărarea cuvintelor

Un exemplu clasic: pentru fiecare cuvânt crești un contor păstrat în map.

void main() {
  const text = 'ana are mere ana are pere ion are mere';
  final contor = <String, int>{};
  for (final cuvant in text.split(' ')) {
    contor[cuvant] = (contor[cuvant] ?? 0) + 1;
  }
  print(contor);
}

Rezultat

{ana: 2, are: 3, mere: 2, pere: 1, ion: 1}

Greșeli frecvente

  • Te aștepți ca map['cheie'] să returneze int. Rezultatul este int?, pentru că cheia poate lipsi; folosește ?? sau verifică întâi cu containsKey.
  • Crezi că două perechi pot avea aceeași cheie. A doua atribuire înlocuiește valoarea, nu adaugă o pereche nouă.

Comenzi înrudite

  • Map.operator[]: map[cheie] citește valoarea unei chei (sau null), iar map[cheie] = valoare adaugă sau înlocuiește o pereche.
  • Map.keys: keys, values și entries dau cheile, valorile sau perechile unui map, ca Iterable, în ordinea din map.
  • Map.containsKey: containsKey verifică dacă o cheie există în map, iar containsValue dacă o valoare apare la vreo cheie.
  • Map.forEach: Cheamă o funcție pentru fiecare pereche cheie–valoare din map, în ordinea din map.
  • LinkedHashMap: Map care păstrează ordinea inserării cheilor; este tipul implicit al map-urilor scrise cu acolade.
  • HashMap: Map bazat pe tabel hash, fără ordine garantată a cheilor; puțin mai ușor decât LinkedHashMap.