Ce face String.compareTo
a.compareTo(b) compară cele două șiruri caracter cu caracter, după codul Unicode. Returnează un număr negativ dacă a vine înaintea lui b, 0 dacă sunt egale și pozitiv dacă vine după. Valoarea exactă este diferența dintre primele caractere diferite (sau diferența de lungime), dar contează doar semnul.
Comparația după cod nu este ordinea din dicționar: toate literele mari vin înaintea celor mici ("Zebra" < "ana"), iar literele cu diacritice vin după z. compareToIgnoreCase ignoră diferența dintre litere mari și mici. compareToFoldCase (Java 26) folosește regulile complete Unicode de „case folding”, de exemplu tratează ß ca ss.
Pentru sortare alfabetică corectă în limba română (ă după a, ș după s) folosește java.text.Collator.getInstance(Locale.of("ro")).
Parametri
| Parametru | Descriere |
|---|---|
altul |
Șirul cu care se compară. Nu poate fi null. |
Ce returnează
Un int: < 0, 0 sau > 0.
Exemple
Exemplul 1: Semnul rezultatului
public class Main {
public static void main(String[] args) {
System.out.println("Ana".compareTo("Ion"));
System.out.println("Ion".compareTo("Ana"));
System.out.println("Ana".compareTo("Ana"));
System.out.println("Ana".compareTo("Anamaria"));
System.out.println("Zebra".compareTo("ana"));
System.out.println("ANA".compareToIgnoreCase("ana"));
}
}
Rezultat
-8
8
0
-5
-7
0
Exemplul 2: Sortare: după cod, fără litere mari/mici, cu Collator
String::compareTo pune „Ștefan” la sfârșit și „ana” după „Mihai”; Collator pentru română dă ordinea din dicționar.
import java.text.Collator;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
List<String> nume = new ArrayList<>(List.of("Ștefan", "ana", "Mihai", "Sorin", "Andrei"));
nume.sort(String::compareTo);
System.out.println(nume);
nume.sort(String::compareToIgnoreCase);
System.out.println(nume);
nume.sort(Collator.getInstance(Locale.of("ro")));
System.out.println(nume);
}
}
Rezultat
[Andrei, Mihai, Sorin, ana, Ștefan]
[ana, Andrei, Mihai, Sorin, Ștefan]
[ana, Andrei, Mihai, Sorin, Ștefan]
Exemplul 3: compareToIgnoreCase vs compareToFoldCase
Litera germană ß devine SS la majuscule. Doar varianta „fold case” le consideră egale.
public class Main {
public static void main(String[] args) {
String a = "Straße";
String b = "STRASSE";
System.out.println(a.compareToIgnoreCase(b));
System.out.println(a.compareToFoldCase(b));
}
}
Rezultat
108
0
Greșeli frecvente
- Verifici
a.compareTo(b) == -1. Rezultatul poate fi orice număr negativ (de exemplu -8); verifică< 0. - Sortezi nume românești cu
compareToși te miri că „Ștefan” apare după „Zamfir”. FoloseșteCollatorcu localizarea română. - Folosești
compareTo(...) == 0doar ca să verifici egalitatea. Este corect, darequals()este mai clar.
Comenzi înrudite
String.equals: Verifică dacă două șiruri au exact același text; equalsIgnoreCase și equalsFoldCase ignoră literele mari/mici.String.regionMatches: Compară o porțiune din șir cu o porțiune din alt șir, opțional fără să țină cont de literele mari și mici.Objects.compare: Compară două obiecte cu un Comparator dat; returnează 0 imediat dacă sunt același obiect (inclusiv ambele null).Integer.compare: compare() compară două int-uri (negativ, 0, pozitiv); max, min și sum sunt variante scurte pentru referințe la metode.