Comparable în Dart

Interfața pentru obiecte care au o ordine naturală; compareTo dă negativ, zero sau pozitiv.

Sintaxă
abstract interface class Comparable<T>
int compareTo(T other)

Ce face Comparable

O clasă care implementează Comparable<T> spune că obiectele ei pot fi ordonate. Metoda a.compareTo(b) returnează un număr negativ dacă a vine înaintea lui b, zero dacă sunt la egalitate și pozitiv dacă a vine după. Contează doar semnul, nu valoarea exactă.

int, double, String, DateTime, Duration și BigInt sunt deja Comparable. De aceea lista.sort() fără argument funcționează pentru ele. Pentru clasele tale implementezi interfața și sort() le ordonează la fel.

Textele se compară după codurile caracterelor: literele mari vin înaintea celor mici, iar literele cu diacritice (ă, ș) vin după z. Pentru ordine alfabetică românească corectă ai nevoie de o comparație proprie sau de pachetul intl.

Parametri

Parametru Descriere
other Obiectul cu care se compară.

Ce returnează

Un int: negativ, 0 sau pozitiv.

Exemple

Exemplul 1: compareTo pe tipurile de bază

void main() {
  print(3.compareTo(7));
  print(7.compareTo(7));
  print('Brașov'.compareTo('Arad'));
  print('ana'.compareTo('Bogdan') > 0);
  print(DateTime(2026, 1, 1).compareTo(DateTime(2025, 12, 31)));
  var orase = ['Iași', 'arad', 'Cluj', 'Brașov'];
  orase.sort();
  print(orase);
}

Rezultat

-1
0
1
true
1
[Brașov, Cluj, Iași, arad]

Exemplul 2: O clasă cu ordine naturală

Elevii se ordonează descrescător după medie, iar la egalitate alfabetic după nume.

class Elev implements Comparable<Elev> {
  final String nume;
  final double medie;
  Elev(this.nume, this.medie);

  @override
  int compareTo(Elev other) {
    var dupaMedie = other.medie.compareTo(medie);
    return dupaMedie != 0 ? dupaMedie : nume.compareTo(other.nume);
  }

  @override
  String toString() => '$nume ($medie)';
}

void main() {
  var clasa = [Elev('Mihai', 8.5), Elev('Ana', 9.75), Elev('Ioana', 8.5), Elev('Radu', 10)];
  clasa.sort();
  print(clasa);
  print(clasa.first.compareTo(clasa.last) < 0);
}

Rezultat

[Radu (10.0), Ana (9.75), Ioana (8.5), Mihai (8.5)]
true

Greșeli frecvente

  • Verifici a.compareTo(b) == -1. Rezultatul poate fi orice număr negativ; scrie < 0.
  • Te aștepți ca sort() pe texte să pună „arad” lângă „Arad”. Literele mari vin înaintea tuturor celor mici; compară cu toLowerCase().

Comenzi înrudite

  • Comparable.compare: Funcție statică ce compară două valori Comparable: același rezultat ca a.compareTo(b), dar se poate da ca argument.
  • List.sort: Sortează lista pe loc, crescător sau după o funcție de comparare.
  • DateTime.isBefore: Compară două date: este înainte (isBefore), după (isAfter) sau exact în același moment (isAtSameMomentAs)?
  • int.clamp: clamp ține un număr între două limite; compareTo compară două numere și dă −1, 0 sau 1.