Creé un programa Java para comparar dos cadenas:
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Muestra "bienvenida". Entiendo que distingue entre mayúsculas y minúsculas. Pero mi problema es que quiero comparar dos cadenas sin distinción entre mayúsculas y minúsculas. Es decir, espero que la salida sea hai
.
java
string
comparison
case-insensitive
user268018
fuente
fuente
s1.equalsIgnoreCase(s2)
es posible que no lo haga en todos los lugares donde sea necesario. Le sugiero que busque de dónde proviene la cadena (un archivo o una base de datos o una entrada de usuario tal vez) y la convierta a mayúsculas (o minúsculas) y continúe usando .equals para la comparación.equalsIgnoreCase
enfoque aceptado . Lea sobre el problema del turco I y problemas similares de Unicode para conocer la justificación.equalsIgnoreCase
devuelve el valor incorrecto para turco de todos modos, porque devuelve verdadero para comparar "i" e "I", aunque debería devolver falso. Así que sospecho que si quieres tener en cuenta las configuraciones regionales, aCollator
es realmente el camino a seguir.toLowerCase
/toUpperCase
en toda la cadena y hacerlo por carácter también da dos resultados diferentes.Respuestas:
s1.equalsIgnoreCase(s2)
: (ver javadoc )s1.equals(s2)
fuente
Utilice
String.equalsIgnoreCase()
.Utilice la referencia de la API de Java para encontrar respuestas como estas:
https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)
https://docs.oracle.com/javase/1.5.0/docs/api/
fuente
String.equalsIgnoreCase
es la opción más práctica para la comparación de cadenas ingenua que no distingue entre mayúsculas y minúsculas.Sin embargo, es bueno tener en cuenta que este método no realiza el plegado completo ni la descomposición de mayúsculas y minúsculas y, por lo tanto , no puede realizar coincidencias sin mayúsculas como se especifica en el estándar Unicode.De hecho, las API de JDK no brindan acceso a información sobre los datos de caracteres de plegado de mayúsculas y minúsculas, por lo que es mejor delegar este trabajo a una biblioteca de terceros probada y comprobada.
Esa biblioteca es ICU , y así es como se podría implementar una utilidad para la comparación de cadenas que no distingue entre mayúsculas y minúsculas:
Comparación ingenua con
String.equalsIgnoreCase
, oString.equals
en cadenas mayúsculas o convertidas a mayúsculas fallará incluso esta simple prueba.(Sin embargo, tenga en cuenta que el tipo de plegado de mayúsculas y minúsculas predefinido
getNFKCCasefoldInstance
es independiente de la configuración regional; para las configuraciones regionales turcasUCharacter.foldCase
puede ser necesario un poco más de trabajo )fuente
Tienes que usar el
compareToIgnoreCase
método delString
objeto.if (compareValue == 0)
significastr1
igualesstr2
.fuente
Ahora saldrá:
hai
fuente
En la API de Java predeterminada tienes:
Por lo tanto, no es necesario que vuelva a escribir un comparador si usa cadenas con estructuras de datos ordenadas.
Es lo que desea para verificaciones de igualdad pura en su propio código.
Solo para obtener más información sobre cualquier cosa relacionada con la igualdad de cadenas en Java. La función hashCode () de la clase java.lang.String "distingue entre mayúsculas y minúsculas":
Por lo tanto, si desea usar una tabla hash / HashMap con cadenas como claves, y las claves como "SomeKey", "SOMEKEY" y "somekey" se consideran iguales, entonces tendrá que envolver su cadena en otra clase (no puede extender String ya que es una clase final). Por ejemplo :
y luego úselo como tal:
fuente
Tenga en cuenta que es posible que desee realizar comprobaciones nulas en ellos también antes de realizar su .equals o .equalsIgnoreCase.
Un objeto String nulo no puede llamar a un método igual.
es decir:
fuente
if (str1 == null || str2 == null) return false;
.if (str1 == str2) return true;
que ambos atienden nulos y también atajos en el caso en que las dos referencias de cadena se refieran al mismo objeto de cadena.Utilice
s1.equalsIgnoreCase(s2)
: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String) .fuente
Puede utilizar equalsIgnoreCase
fuente
Puede encontrar más información sobre cadenas en Clases de cadenas y Tutoriales de cadenas
fuente
Para ser nullsafe, puede utilizar
o
fuente
fuente