Confronto di stringhe in Java

Cosa significa “confrontare due stringhe lessicograficamente”?

A partire dalle risposte di @Bozho e @aioobe, i confronti lessicografici sono simili all’ordine che si potrebbe trovare in un dizionario.

La class Java String fornisce il metodo .compareTo () per confrontare lessicograficamente le stringhe. È usato come questa "apple".compareTo ("banana") .

Il ritorno di questo metodo è un int che può essere interpretato come segue:

  • restituisce <0 allora la stringa che chiama il metodo è lessicograficamente prima (viene prima in un dizionario)
  • restituisce == 0 quindi le due stringhe sono equivalenti lessicograficamente
  • restituisce> 0, quindi il parametro passato al metodo compareTo è prima lessicograficamente.

Più specificamente, il metodo fornisce la prima differenza diversa da zero nei valori ASCII.

Quindi "computer".compareTo ("comparison") restituirà un valore di (int) 'u' - (int) 'a' (21). Poiché questo è un risultato positivo, il parametro ( "comparison" ) è per primo lessicografico.

Esiste anche una variante .compareToIgnoreCase () che restituirà 0 per "a".compareToIgnoreCase ("A"); per esempio.

La dicitura “confronto” è leggermente fuorviante. Non stai comparando per l’uguaglianza rigorosa, ma per quale stringa viene prima nel dizionario (lessico).

Questa è la caratteristica che consente alle collezioni di stringhe di essere ordinabili.

Si noti che questo dipende molto dalle impostazioni internazionali attive. Per esempio, qui in Danimarca abbiamo un carattere “å” che era scritto come “aa” ed è molto diverso da due singoli a (EDIT: se pronunciato come “å”!). Quindi le regole di ordinamento danese trattano due consecutivi a identicamente a un “å”, il che significa che va dietro a z. Ciò significa anche che i dizionari danesi sono ordinati in modo diverso da quelli inglesi o svedesi.

Il String.compareTo(..) esegue un confronto lessicografico. Lessicographically == alphebetically.

Confrontando sequenzialmente le lettere che hanno la stessa posizione l’una contro l’altra .. più come il modo in cui ordini le parole in un dizionario

Se controlli quale stringa verrà prima in un lessico, hai fatto un confronto lessicografico delle stringhe!

Alcuni link:

  • Wikipedia – String (informatica) Ordinamento lessicografico
  • Nota sui confronti: confronto lessicografico tra stringhe

Rubato da quest’ultimo collegamento:

Una stringa s precede una stringa t in ordine lessicografico se

  • s è un prefisso di t , o
  • se c e d sono rispettivamente il primo carattere di s e t in cui s e t differiscono, allora c precede d nell’ordine dei caratteri.

Nota: per i caratteri che sono lettere alfabetiche, l’ordine dei caratteri coincide con l’ordine alfabetico. Le cifre precedono le lettere e le lettere maiuscole precedono quelle minuscole.

Esempio:

  • casa precede la famiglia
  • La famiglia precede la casa
  • il compositore precede il computer
  • H2O precede HOTEL

Java lessicographically order:

  1. Numeri prima
  2. Maiuscole prima
  3. Minuscolo

Strano come sembra, è vero …
Ho dovuto scrivere catene di confronto per essere in grado di modificare il comportamento predefinito.
Gioca con lo snippet seguente con esempi migliori di stringhe di input per verificare l’ordine (avrai bisogno di JSE 8):

 import java.util.ArrayList; public class HelloLambda { public static void main(String[] args) { ArrayList names = new ArrayList<>(); names.add("Kambiz"); names.add("kambiz"); names.add("k1ambiz"); names.add("1Bmbiza"); names.add("Samantha"); names.add("Jakey"); names.add("Lesley"); names.add("Hayley"); names.add("Benjamin"); names.add("Anthony"); names.stream(). filter(e -> e.contains("a")). sorted(). forEach(System.out::println); } } 

Risultato

1Bmbiza
benzoino
Hayley
Jakey
Kambiz
Samantha
k1ambiz
Kambiz

Si noti che questa risposta è specifica per le impostazioni locali.
Si noti che sto filtrando per un nome contenente la lettera minuscola a.