J'ai créé un programme Java pour comparer deux chaînes:
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Il affiche "bienvenue". Je comprends que c'est sensible à la casse. Mais mon problème est que je souhaite comparer deux chaînes sans respecter la casse. Ie je m'attends à ce que la sortie soit hai
.
java
string
comparison
case-insensitive
user268018
la source
la source
s1.equalsIgnoreCase(s2)
vous risquez de ne pas le faire partout où cela doit être fait. Je suggère que vous trouviez d'où vient la chaîne - un fichier ou une base de données ou une entrée utilisateur peut-être - et que vous la convertissiez en majuscules (ou en minuscules) et que vous continuiez à utiliser .equals pour la comparaison.equalsIgnoreCase
approche acceptée . Renseignez-vous sur le problème turc I et les problèmes Unicode similaires pour la justification.equalsIgnoreCase
renvoie de toute façon la mauvaise valeur pour le turc, car il renvoie true pour comparer "i" et "I", même s'il doit renvoyer false. Donc je soupçonne que si vous voulez prendre en compte les paramètres régionaux,Collator
c'est en fait la voie à suivre.toLowerCase
/toUpperCase
sur toute la chaîne et le faire par caractère donne également deux résultats différents.Réponses:
s1.equalsIgnoreCase(s2)
: (voir javadoc )s1.equals(s2)
la source
Utilisation
String.equalsIgnoreCase()
.Utilisez la référence de l'API Java pour trouver des réponses comme celles-ci:
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/
la source
String.equalsIgnoreCase
est le choix le plus pratique pour la comparaison naïve de chaînes insensible à la casse.Cependant, il est bon de savoir que cette méthode ne fait ni pliage ni décomposition complet de la casse et ne peut donc pas effectuer de correspondance sans casse comme spécifié dans la norme Unicode.En fait, les API JDK ne fournissent pas d'accès aux informations sur les données de caractères de pliage de cas, il est donc préférable de déléguer ce travail à une bibliothèque tierce éprouvée.
Cette bibliothèque est ICU , et voici comment implémenter un utilitaire pour la comparaison de chaînes insensible à la casse:
Comparaison naïve avec
String.equalsIgnoreCase
, ouString.equals
sur des chaînes majuscules ou minuscules échouera même ce test simple.(Notez cependant que la saveur prédéfinie de pliage de cas
getNFKCCasefoldInstance
est indépendante des paramètres régionaux; pour les paramètres régionaux turcs, un peu plus de travailUCharacter.foldCase
peut être nécessaire.)la source
Vous devez utiliser la
compareToIgnoreCase
méthode de l'String
objet.if (compareValue == 0)
cela signifiestr1
égalstr2
.la source
Maintenant, il affichera:
hai
la source
Dans l'API Java par défaut, vous avez:
Vous n'avez donc pas besoin de réécrire un comparateur si vous deviez utiliser des chaînes avec des structures de données triées.
C'est ce que vous voulez pour des vérifications d'égalité pure dans votre propre code.
Juste pour plus d'informations sur tout ce qui concerne l'égalité des chaînes en Java. La fonction hashCode () de la classe java.lang.String "est sensible à la casse":
Donc, si vous voulez utiliser un Hashtable / HashMap avec des chaînes comme clés, et que des clés telles que "SomeKey", "SOMEKEY" et "somekey" soient considérées comme égales, vous devrez alors envelopper votre chaîne dans une autre classe (vous ne pouvez pas étendre String puisqu'il s'agit d'une classe finale). Par exemple :
puis utilisez-le comme tel:
la source
Notez que vous souhaiterez peut-être effectuer des vérifications nulles sur eux également avant de faire vos .equals ou .equalsIgnoreCase.
Un objet String nul ne peut pas appeler une méthode equals.
c'est à dire:
la source
if (str1 == null || str2 == null) return false;
.if (str1 == str2) return true;
laquelle les deux traitent les valeurs nulles et raccourcit également le cas où les deux références de chaîne font référence au même objet de chaîne.Utilisation
s1.equalsIgnoreCase(s2)
: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String) .la source
Vous pouvez utiliser equalsIgnoreCase
la source
Vous trouverez plus d'informations sur la chaîne dans les didacticiels sur les classes de chaînes et les chaînes
la source
Pour être nullsafe, vous pouvez utiliser
ou
la source
la source