MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Compararea șirurilor cu Int.Collator

Pentru compararea șirurilor ținând cont de specificul limbii se utilizează tipul Collator. Pentru acesta, tipul Collator oferă metoda compare(), care acceptă două șiruri ca parametri:

collator.compare(string1, string2)

Metoda compare returnează una dintre cele trei valori numerice:

  • 1, dacă primul șir este "mai mare" decât al doilea (primul șir se află după al doilea șir în ordinea lexicografică)
  • -1, dacă al doilea șir este "mai mare" decât primul (primul șir se află înaintea celui de-al doilea)
  • 0, dacă ambele șiruri sunt egale

Exemplu de comparare:

const collator = new Intl.Collator("ro-RO");
console.log(collator.compare("b", "a"));    // 1
console.log(collator.compare("b", "b"));    // -1
console.log(collator.compare("b", "c"));    // -1
console.log(collator.compare("b", "b"));    // 0

console.log(collator.compare("lume", "lumina"));   // 1
console.log(collator.compare("lume", "luna"));    // -1
console.log(collator.compare("lume", "lume"));    // 0

Configurarea comparării

Principiul comparării șirurilor este determinat de obiectul de configurare, care este transmis constructorului Int.Collator ca al doilea parametru și care definește următoarele proprietăți:

  • localeMatcher: reprezintă algoritmul folosit pentru selectarea localei. Poate lua două valori: "lookup" și "best fit" (implicit). Valoarea lookup presupune utilizarea unui algoritm definit în standard. Valoarea best fit folosește localizarea oferită de mediul de execuție
  • usage: specifică dacă compararea șirurilor va fi folosită pentru sortare sau căutare. Valorile posibile sunt "sort" (pentru sortare) și "search" (pentru căutare - implicit)
  • sensitivity: specifică ce simboluri trebuie considerate inegale. Valorile posibile:

1) "base": șirurile sunt considerate inegale dacă diferă prin literele de bază. Exemplu: a ≠ b, a = á, a = A. 2) "accent": șirurile sunt considerate inegale dacă diferă prin literele de bază sau semnele diacritice. Exemplu: a ≠ b, a ≠ á, a = A. 3) "case": șirurile sunt considerate inegale dacă diferă prin literele de bază sau majusculă/minusculă. Exemplu: a ≠ b, a = á, a ≠ A. 4) "variant": șirurile sunt considerate inegale dacă diferă prin literele de bază, majusculă/minusculă sau semnele diacritice. Exemplu: a ≠ b, a ≠ á, a ≠ A. Implicit

  • ignorePunctuation: dacă trebuie să se ignore punctuația. Acceptă valorile true (punctuația este ignorată) și false (nu este ignorată, implicit)
  • numeric: specifică dacă șirurile trebuie comparate ca numere (de exemplu, "1" < "5" < "10"). Acceptă valorile true și false (implicit)
  • caseFirst: specifică dacă trebuie luat în considerare cazul primei litere. Acceptă valorile "upper", "lower" sau "false" (implicit)

De exemplu, să nu ținem cont de majuscule/minuscule la comparare:

const standardCollator = new Intl.Collator("ro-RO");
console.log(standardCollator.compare("Casa", "casa"));   // 1 - șirurile nu sunt egale

const baseCollator = new Intl.Collator("ro-RO", {sensitivity: "base"});
console.log(baseCollator.compare("Casa", "casa"));   // 0 - șirurile sunt egale

Sortarea șirurilor

Metoda compare() este utilă pentru sortarea unui array de șiruri. În special, metoda sort() a obiectului array acceptă o funcție de sortare sau comparare, care apoi compară perechi de elemente ale array-ului respectiv și, astfel, realizează sortarea:

const collator = new Intl.Collator("ro", {usage: "sort"});
const people = ["Tom", "Bob", "Sam", "Alice", "Kate"];
people.sort(collator.compare);  // sortăm array-ul
console.log(people);   //  ["Alice", "Bob", "Kate", "Sam", "Tom"]

Acest exemplu demonstrează cum Intl.Collator poate fi folosit pentru a sorta un array de nume într-o manieră care respectă regulile lingvistice specifice limbii indicate.

← Lecția anterioară Lecția următoare →