2012-02-21 11 views
7

C'è un modo per ordinare correttamente le stringhe internazionali in Android? Io uso un comparatore personalizzato e un metodo compareTo(), ma non è abbastanza per me. Voglio che lettere come questa "ö" siano visualizzate vicino a "o", ma tutte sono in fondo alla lista. Come posso costringere il comparatore a pensare che siano simili a "o, a, ecc ..."?Android confronta lettere speciali

risposta

15

In caso di utilizzo di stringhe sensibili alle impostazioni internazionali, utilizzare Collator. Dalla documentazione:

Esegue confronto tra stringhe locale-sensitive. Una sottoclasse di calcestruzzo, RuleBasedCollator, consente la personalizzazione dell'ordine di confronto per l'uso di serie di regole.

Esempio di stringhe a confronto:

Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;) 
System.out.println(deCollator.compare("abcö", "abco")); 

stampe 1.


Se si desidera ordinare l'elenco delle stringhe utilizzando sopra collator, è possibile scrivere:

final List<String> strings = Arrays.asList(
     "über", "zahlen", "können", "kreativ", "Äther", "Österreich"); 
Collections.sort(strings, deCollator); // Collator implements Comparator 
System.out.println(strings); 

stampe:

[Äther, können, kreativ, Österreich, über, zahlen] 

EDIT: appena notato che siete polacco , esempio polacco qui sotto:

final List<String> strings = Arrays.asList(
     "pięć", "piec", "Pieczka", "pięść", "pieczęć", "pieczątka"); 
Collections.sort(strings, Collator.getInstance(new Locale("pl", "PL"))); 
System.out.println(strings); 
// output: [piec, pieczątka, pieczęć, Pieczka, pięć, pięść] 
+0

Grazie per la tua ottima risposta! ;) In realtà, ho trovato una soluzione ancora più semplice: 'Collator collator = Collator.getInstance(); collator.setDecomposition (Collator.CANONICAL_DECOMPOSITION); collator.compare (uno, due) 'Il secondo esempio qui mostra cosa fa la regola' CANONICAL_DECOMPOSITION': http://developer.android.com/reference/java/text/Collator.html – lomza

+1

Attenzione, 'Collator.getInstance () 'senza esplicito' Locale' è dipendente dall'ambiente: esso restituisce un'istanza di Collator che è appropriata per le ** impostazioni internazionali predefinite dell'utente **. Vedi "[Diffida delle impostazioni internazionali predefinite] (http://developer.android.com/reference/java/util/Locale.html#default_locale)" ._ – Xaerxess

+0

Grazie per l'avviso, ma ora sono in dubbio. Ho bisogno di dati ordinati solo per la visualizzazione all'utente, non per inviarlo da qualche parte o per calcolare qualcosa ... Quindi probabilmente le impostazioni locali predefinite sono sufficienti? Ma se mi piacerebbe ordinare correttamente i caratteri tedeschi e danesi e usarli come output della macchina, la scelta migliore sarebbe usare il locale 'Local.US'? – lomza

Problemi correlati