String.compareTo în Java

Compară două șiruri în ordine lexicografică: rezultat negativ, zero sau pozitiv; variante fără litere mari/mici.

Sintaxă
int compareTo(String altul)
int compareToIgnoreCase(String altul)   // Java 1.2
int compareToFoldCase(String altul)     // Java 26

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ște Collator cu localizarea română.
  • Folosești compareTo(...) == 0 doar ca să verifici egalitatea. Este corect, dar equals() 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.