2010-08-20 9 views
11

En mi aplicación Java necesito comparar el elemento de dos listas, ya sea similar o no.Hacer que el elemento ArrayList no distinga entre mayúsculas y minúsculas

En resumen Supongamos que tengo dos listas declarado como se muestra a continuación

List<String> a = new ArrayList<String>(); 
    a.add("one"); 
    a.add("three"); 
    a.add("two"); 
Collections.sort(a); 


List<String> a1 = new ArrayList<String>(); 
    a1.add("ONE"); 
    a1.add("two"); 
    a1.add("THREE"); 
Collections.sort(a); 

Si escribo una condición para la igualdad se produce un error ya que algunos de elemento de la lista se encuentra en diferentes casos como

if(a.equals(a1)){ 
    System.out.println("equal"); 
} else{ 
    System.out.println("not equal"); 
} 

Será mostrar el resultado "No es igual"

Así que por favor dígame cómo puedo hacer que el elemento de la lista no distinga entre mayúsculas y minúsculas en lenguaje Java solamente.

gracias y cuanto

+2

equalsIgnoreCase() - http://download-llnw.oracle.com/javase/6/docs/api/java/lang/String. html # equalsIgnoreCase (java.lang.String) –

+1

La solución no es hacer que los * elementos * no distingan entre mayúsculas y minúsculas (lo que técnicamente significaría volver a implementar String, no se puede extender porque es final) con una clase contenedora cuyos métodos * equals * y * compareTo * son mayúsculas y minúsculas -insensible), sino más bien hacer que la * comparación * no distinga entre mayúsculas y minúsculas. – user359996

Respuesta

20

¿Por qué no utilizar en su lugar un SortedSet con un comparador insensible a las mayúsculas y minúsculas? Con el comparador String.CASE_INSENSITIVE_ORDER

Su código se reduce a

Set<String> a = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 
    a.add("one"); 
    a.add("three"); 
    a.add("two"); 


Set<String> a1 = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 
    a1.add("ONE"); 
    a1.add("two"); 
    a1.add("THREE"); 

Y CONDICIONES equals deben trabajar sin ningún problema

EDITAR modificado de acuerdo con los comentarios. Gracias a todos ustedes por corregirme.

+1

(debe usar un constructor TreeSet diferente para usar el comparador personalizado) –

+2

Debería * usar * el 'Comparador' que definió en su código de ejemplo ;-) –

+3

Ver también el comparador estático' String.CASE_INSENSITIVE_ORDER' en la clase String –

7

Habría que hacerlo manualmente:

public boolean equalsIgnoreCase(List<String> l1, List<String> l2) { 
    if (l1.size() != l2.size()) { 
    return false; 
    } 
    Iterator<String> i1=l1.iterator(); 
    Iterator<String> i2=l2.iterator(); 
    while(i1.hasNext()) { 
    if (!i1.next().equalsIgnoreCase(i2.next()) { 
     return false; 
    } 
    } 
    return true; 
} 
+0

¡Uy, estúpido error tipográfico, gracias;;) –

14

Es necesario utilizar

Collections.sort(a, String.CASE_INSENSITIVE_ORDER); 

con el fin de resolver haciendo caso omiso caso, se puede utilizar el equalsIgnoreCase Método en String para comparar con los valores

Puede, por supuesto, crear su propio CaseIns clase ensitiveList, tenemos CaseInsensitiveSet & CaseInsensitiveMap en nuestra base de código

+1

Esa no es una solución completa (tampoco lo es mi publicación a continuación ;-)). –

+0

Como dice Joachim, esto ** ** no hará que 'a.equals (a1) 'devuelva verdadero. –

+0

Sí, publiqué un poco demasiado pronto, he editado mi respuesta original –

0

Deberá anular el método equals() en la lista para que haga lo que desee. Echa un vistazo a ArrayList.equals() actual y adáptalo para que se compare con equalsIgnoreCase en lugar de equals().

+0

O lo haces tomar un comparador como un argumento de constructor. Pero el problema es que ambos violan el contrato de 'Colección' y esto podría hacer que las cosas no funcionen como se esperaba. –

6

También puede envolver su cadena en una clase de ayuda y poner en práctica la es igual a & comparar métodos para ello.

public class StringWrapper implements Comparable<StringWrapper> { 
    private String value; 

    StringWrapper(Strig value) { 
     this.value = value; 
    } 

    @Override boolean equals(Object o) { 
     returns String.CASE_INSENSITIVE_ORDER.equals(
      (StringWrapper) o).value 
      this.value); 
    } 

    @Override int compareTo(StringWrapper sw) { 
     returns String.CASE_INSENSITIVE_ORDER.compare(
      this.value 
      sw.value);   
    } 

    @Override String toString() { 
     return this.value; 
    } 

    @Override int hashCode() { 
     return this.value.toLowerCase.hashCode(); 
    } 
} 

And then : 

List<StringWrapper> a = new ArrayList<StringWrapper>(); 
    a.add(StringWrapper("one")); 
    a.add(StringWrapper("TWO")); 
    a.add(StringWrapper("three")); 
Collections.sort(a); 
+0

Debe implementar 'Comparable ' y cambiar el método 'compare (Object)' 'compareTo (StringWrapper)'. También debe implementar 'hashCode()', que puede ser complicado. –

+0

(StringWrapper necesita implementar la interfaz 'Comparable'; de lo contrario,' Collections.sort' causa un error de tiempo de compilación) –

+0

este es definitivamente el camino a seguir (+1) –

0

¿Qué le parece escribir una clase Wrapper en la lista que está utilizando, esto evitaría tener un almacenamiento incoherente de los elementos.

public class CaseInsensitiveStringList extends ArrayList<String> { 

    @Override 
    public void add(final int index, final String element) { 
     super.add(index, element.toLowerCase()); 
    } 

    @Override 
    public boolean add(final String o) { 
     return super.add(o.toLowerCase()); 
    } 

    @Override 
    public boolean addAll(final Collection<? extends String> c) { 
     final ArrayList<String> temp = new ArrayList<String>(c.size()); 
     for (final String s : c) { 
      temp.add(s.toLowerCase()); 
     } 
     return super.addAll(temp); 
    } 

    @Override 
    public boolean addAll(final int index, final Collection<? extends String> c) { 
     final ArrayList<String> temp = new ArrayList<String>(c.size()); 
     for (final String s : c) { 
      temp.add(s.toLowerCase()); 
     } 
     return super.addAll(index, temp); 
    } 
} 
0

lista de cadenas Para ordenar ignorando mayúsculas y minúsculas

Arrays.sort(myArray, Collator.getInstance()); 
Cuestiones relacionadas