2009-11-07 20 views
7

Bueno, probé TreeMap pero no tiene en cuenta IgnoreCase en la comparación de cadenas. Necesito ordenar lexicográficamente e ignorar el caso. ¿Hay alguna otra manera?Ordenar mapa <String, Object> por claves con IgnoreCase?

Gracias, eso funciona (TreeMap (Comparador c)). Sin embargo, tengo otra pregunta:

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 

¿Cómo puedo universializar el comparador para trabajar con diferentes objetos? suponiendo que todos tengan el método getId().

Gracias, Martin

+7

Martin, no es una buena idea cambiar completamente la pregunta. El próximo usuario con el privilegio de hacerlo (tal vez usted) debería revertirlo a su estado anterior. ¡Solo publique una nueva pregunta! –

+1

+1, De acuerdo, cuando alguien le da una respuesta a su pregunta, debe aceptar la respuesta y pasar a una nueva pregunta si surge alguna. – camickr

+0

Lo he retrocedido. – finnw

Respuesta

34

que desee utilizar un Comparator en el TreeMap constructor. En particular, mira String.CASE_INSENSITIVE_ORDER.

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER); 

Usando Collator o una costumbre Comparator puede funcionar mejor para usted en un idioma distinto del Inglés o si necesita pedir más complejo.

+2

+1 para el enlace a 'String.CASE_INSENSITIVE_ORDER'. – tangens

+0

Recuerde: si usted es un programador de inglés y usted tiene el control de las claves que * no * necesita preocuparse por la configuración regional, ya que no se están haciendo comparaciones con los valores, se están haciendo en el claves ;-) –

1

Proporcionar un comparador que compara el caso cuerdas ignorado.

TreeMap (Comparador c)

0

Si tuviera una lista, yo diría que probar Collections.sort() con un comparador. Puede que tenga que lanzar su propio Comparador que utiliza String.equalsIgnoreCase() en lugar de equals().

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

Pero estaba en el camino correcto. Pruebe el constructor que toma un TreeMap Comparador:

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

La mejor manera sería utilizar un clasificador. Un colector es una clase incorporada, que también implementa Comparable, y por lo tanto puede usarlo para su TreeMap.

Con una alzadora, también puede controlar la fuerza de la comparación, por ejemplo, si también quiere ser acento insensible.

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

Sí, lo que desea es utilizar el constructor TreeMap que toma un Comparador. Haga un comparador que use compareToIgnoreCase.

0

Sospecho que debe construir su TreeMap con un comparador personalizado.

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

¿Cómo puedo universalizar el comparador para trabajar con diferentes objetos? suponiendo que todos tienen el método getId().

Debe poder utilizar un BeanComparator.

+0

He recomendado que la pregunta se revierta a la pregunta original y se publique una nueva pregunta; si y cuando eso suceda, esta respuesta probablemente deba eliminarse también. –

Cuestiones relacionadas