2012-08-10 12 views
7

Ho un problema nel confrontare strings.I vuole confrontare due "Ed" e "EF" testi in lingua francese come questojava CollationKey ordinamento sbagliato

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("éd"); 
CollationKey b = localeSpecificCollator.getCollationKey("ef"); 
System.out.println(a.compareTo(b)); 

Questo stamperà -1, ma in alfabeto francese e vengo prima é. Ma quando mettiamo a confronto solo e e é come questo

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE); 
CollationKey a = localeSpecificCollator.getCollationKey("é"); 
CollationKey b = localeSpecificCollator.getCollationKey("e"); 
System.out.println(a.compareTo(b)); 

risultato è 1. Puoi dirci cosa c'è che non va nella prima parte del codice?

+1

Ho la "stesso problema" (credo abbastanza accettabile) con '' Swing' Comparator' e le sue implementazioni per RowSorter' 'e' RowFilter' in' 'JTable' per Win1250-2' eq. 'ISO 8859-1/2', per tutti i non-ASCII Laddove le casse sono ordinate alla fine, ad esempio e -> e EI, mi dispiace mai avuto bisogno di risolto, perché è abbastanza accettabile e ordinamento logico con – mKorbel

risposta

3

Questo sembra essere il comportamento previsto e sembra anche essere il modo corretto di ordinare alfabeticamente in francese.

Il Android javadoc dà un suggerimento per spiegare perché si comporta così - Suppongo che i dettagli della implementazione in Android sono simili, se non identici, a standard JDK:

Una differenza terziaria viene ignorato quando c'è una differenza primaria o secondaria in qualsiasi punto delle stringhe.

In altre parole, poiché le tue 2 stringhe sono ordinabili osservando solo le differenze primarie (esclusi gli accenti) il raccoglitore non controlla le altre differenze.

Sembra essere compatibile con il Unicode Collation Algorithm (UCA):

differenze di accento sono tipicamente ignorate, se le lettere di base differiscono.

Ed aussi sembra essere il modo corretto di precisare in ordine alfabetico in francese, selon la wikipedia article on "ordre alphabetique":

Nella prima analisi, i caratteri accentati, così come la capitale, hanno lo stesso rango alfabetico che il carattere fondamentale
Se più parole hanno lo stesso rango alfabetico, cerchiamo di distinguerli grazie alla tomaia e gli accenti (per la posta era l'ordine e, é, è, ê, ë)

In inglese: l'ordine di ignorare INIZIALMENTE accenti e caso - se due parole non possono essere ordinati in questo modo, gli accenti e caso sono prese in considerazione allora.

0

Dal JavaDoc:

È possibile impostare la proprietà la forza di una Collator per determinare il livello di differenza considerata significativa in confronto. Sono disponibili quattro punti di forza: PRIMARIO, SECONDARIO, TERZIARIO e IDENTICO. L'esatta assegnazione dei punti di forza alle caratteristiche del linguaggio dipende dalle impostazioni locali. Ad esempio, in ceco, "e" e "f" sono considerate differenze primarie, mentre "e" e "ì" sono differenze secondarie, "e" ed "E" sono differenze terziarie e "e" ed "e" sono identici .

provare diversi punti di forza:

localeSpecificCollator.setStrength(Collator.PRIMARY); 

e vediamo cosa succede.

+1

Ho provato tutti i guadagni di forza , mira non ha aiutato – Ashot

+1

@Tichodroma Le differenze secondarie/terziarie non sono presi in considerazione se ci sono differenze principali. – assylias