Criei um programa Java para comparar duas strings:
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Ele exibe "bem-vindo". Eu entendo que é sensível a maiúsculas e minúsculas. Mas meu problema é que eu quero comparar duas strings sem distinção entre maiúsculas e minúsculas. Ou seja, espero que a saída seja hai
.
java
string
comparison
case-insensitive
user268018
fonte
fonte
s1.equalsIgnoreCase(s2)
poderá falhar em fazê-lo em todos os lugares em que precisa ser feito. Eu sugiro que você descubra de onde vem a string - um arquivo ou banco de dados ou entrada do usuário talvez - e converta para maiúsculas (ou minúsculas) e continue a usar .equals para a comparação.equalsIgnoreCase
abordagem aceita . Leia sobre o problema turco I e questões similares do Unicode para obter a justificativa.equalsIgnoreCase
retorna o valor incorreto para turco de qualquer maneira, porque retorna verdadeiro para comparar "i" e "I", embora deva retornar falso. Portanto, suspeito que, se você quiser levar em conta os locais, aCollator
é realmente o caminho a percorrer.toLowerCase
/toUpperCase
em toda a string e fazer por caractere também dá dois resultados diferentes.Respostas:
s1.equalsIgnoreCase(s2)
: (ver javadoc )s1.equals(s2)
fonte
Use
String.equalsIgnoreCase()
.Use a referência da API Java para encontrar respostas 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/
fonte
String.equalsIgnoreCase
é a escolha mais prática para comparação ingênua de strings que não diferencia maiúsculas de minúsculas.No entanto, é bom estar ciente de que este método não faz a dobragem completa de maiúsculas nem a decomposição e, portanto, não pode realizar a correspondência sem caixa conforme especificado no padrão Unicode. Na verdade, as APIs JDK não fornecem acesso a informações sobre dados de caractere de dobra de caso, portanto, esse trabalho é mais bem delegado a uma biblioteca de terceiros testada e comprovada.
Essa biblioteca é ICU , e aqui está como alguém poderia implementar um utilitário para comparação de strings que não diferencia maiúsculas de minúsculas:
A comparação ingênua com
String.equalsIgnoreCase
ouString.equals
em strings com letras maiúsculas ou minúsculas irá falhar até mesmo neste teste simples.(No entanto, observe que o tipo de dobramento de maiúsculas predefinido
getNFKCCasefoldInstance
é independente do local; para localidades turcas, um pouco mais de trabalho envolvendoUCharacter.foldCase
pode ser necessário.)fonte
Você tem que usar o
compareToIgnoreCase
método doString
objeto.if (compareValue == 0)
isso significastr1
igualstr2
.fonte
Agora vai gerar:
hai
fonte
Na API Java padrão, você tem:
Portanto, você não precisa reescrever um comparador se for usar strings com estruturas de dados classificados.
É o que você deseja para verificações de igualdade puras em seu próprio código.
Apenas para maiores informações sobre qualquer coisa relacionada à igualdade de Strings em Java. A função hashCode () da classe java.lang.String "diferencia maiúsculas de minúsculas":
Então se você quiser usar um Hashtable / HashMap com Strings como chaves, e ter chaves como "SomeKey", "SOMEKEY" e "Somekey" sejam vistas como iguais, então você terá que embrulhar sua string em outra classe (você não pode estender String, uma vez que é uma classe final). Por exemplo :
e então usá-lo como tal:
fonte
Observe que você pode querer fazer verificações de nulos neles também antes de fazer seu .equals ou .equalsIgnoreCase.
Um objeto String nulo não pode chamar um método equals.
ie:
fonte
if (str1 == null || str2 == null) return false;
.if (str1 == str2) return true;
qual ambos atendem a nulos e também atalhos no caso em que as duas referências de string se referem ao mesmo objeto de string.Use
s1.equalsIgnoreCase(s2)
: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String) .fonte
Você pode usar equalsIgnoreCase
fonte
Mais sobre string pode ser encontrado em String Class e Tutoriais de String
fonte
Para ser nullsafe, você pode usar
ou
fonte
fonte