2009-11-07 9 views
7

Bene, ho testato TreeMap ma non tiene conto di IgnoreCase sulla comparazione delle stringhe. Ho bisogno di ordinare lessicograficamente e ignorando il caso. C'è un altro modo?Ordinare la mappa <String, Object> con le chiavi con IgnoreCase?

Grazie, funziona (TreeMap (comparatore c)). Tuttavia, ho un'altra domanda:

public final Comparator<Object> STR_IGN_CASE_COMP = new Comparator<Object>() { 

    public int compare(Object h1, Object h2) { 
      String s1 = h1.getId(); 
      String s2 = h2.getId(); 
      return s1.compareToIgnoreCase(s2); 
    } 
}; //STR_IGN_CASE_COMP 

Come posso universializzare il comparatore per lavorare con oggetti diversi? supponendo che tutti abbiano il metodo getId().

Grazie, Martin

+7

Martin, non è una buona idea cambiare completamente la domanda. Il prossimo utente con il privilegio di farlo (forse tu) dovrebbe ripristinarlo al suo stato precedente. Pubblica una nuova domanda! –

+1

+1, d'accordo, quando qualcuno ti dà una risposta alla tua domanda, dovresti accettare la risposta e passare a una nuova domanda se ne sorgono. – camickr

+0

L'ho arrotolato indietro. – finnw

risposta

34

si desidera utilizzare un Comparator nel TreeMap constructor. In particolare, guarda String.CASE_INSENSITIVE_ORDER.

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER); 

Utilizzando Collator o un costume Comparator può funzionare meglio per voi in un locale non inglese o se avete bisogno di ordine più complesso.

+2

+1 per il collegamento a 'String.CASE_INSENSITIVE_ORDER'. – tangens

+0

Ricorda: se sei un programmatore inglese e hai il controllo delle chiavi che * non * devi preoccuparti delle impostazioni locali, poiché non vengono effettuati confronti sui valori, vengono eseguiti sul chiavi ;-) –

1

Fornire un comparatore che confronta le stringhe caso ignorato.

TreeMap (Comparator c)

0

Se si ha un elenco, direi provare Collections.sort() con un comparatore. Potrebbe essere necessario eseguire il rollover del proprio Comparatore che utilizza String.equalsIgnoreCase() anziché equals().

public static <T> void sort(List<T> list, 
         Comparator<? super T> c) 

Ma ero sulla strada giusta. Prova il costruttore TreeMap che accetta un comparatore:

public TreeMap(Comparator<? super K> comparator) 
6

Il modo migliore sarebbe utilizzare un Collator. Un collator è una classe integrata, che implementa anche Comparable, e quindi puoi usarlo per la tua TreeMap.

Con un fascicolatore, è anche possibile controllare la forza del confronto, ad esempio, se si desidera che anche l'accento sia insensibile.

Collator stringCollator = Collator.getInstance(); 
stringCollator.setStrength(Collator.PRIMARY); 
new TreeMap<String, String>(stringCollator) 
0

Sì, ciò che si desidera è utilizzare il costruttore TreeMap che accetta un comparatore. Crea un comparatore che usi compareToIgnoreCase.

0

Ho il sospetto che dovresti costruire il tuo TreeMap con un comparatore personalizzato.

import java.text.Collator; 
import java.util.Comparator; 

class IgnoreCaseComp implements Comparator<String> { 
    Collator col; 

    IgnoreCaseComp() { 
    col = Collator.getInstance(); 

    col.setStrength(Collator.PRIMARY); 
    } 

    public int compare(String strA, String strB) { 
    return col.compare(strA, strB); 
    } 
} 
0

Come posso universalizzare il comparatore per lavorare con oggetti diversi? assumendo che tutti abbiano il metodo getId().

Dovresti essere in grado di utilizzare uno BeanComparator.

+0

Ho raccomandato di ripristinare la domanda alla domanda originale e di inserire una nuova domanda; se e quando ciò accadrà, probabilmente anche questa risposta dovrebbe essere rimossa. –

Problemi correlati