115 votes

Comment puis-je rendre ma comparaison de chaîne insensible à la casse ?

J'ai créé un programme Java pour comparer deux chaînes de caractères :

String str = "Hello";

if (str.equals("hello")) {
    System.out.println("correspondance");
} else {
    System.out.println("pas de correspondance");
}

C'est sensible à la casse. Comment puis-je le modifier pour que ce ne soit pas le cas ?

3 votes

Si vous savez que la sensibilité à la casse est importante, vous pourriez convertir les deux en minuscules ou en majuscules avant de les comparer.

1 votes

Si vous utilisez s1.equalsIgnoreCase(s2) vous pourriez échouer à le faire partout où cela doit être fait. Je suggère que vous trouviez d'où vient la chaîne - d'un fichier, d'une base de données ou d'une saisie utilisateur peut-être - et la convertissez en majuscules (ou minuscules) et continuez à utiliser .equals pour la comparaison.

2 votes

Ne convertissez pas en minuscules/majuscules (comme suggéré par les commentaires ci-dessus), utilisez l'approche acceptée equalsIgnoreCase. Renseignez-vous sur le problème "i" turc et des problèmes similaires liés à l'Unicode pour la justification.

182voto

Michael Bavin Points 1045

La meilleure façon est d'utiliser str.equalsIgnoreCase("foo"). Il est spécifiquement optimisé à cet effet.

Vous pouvez également convertir les deux chaînes en majuscules ou minuscules avant de les comparer avec equals. C'est une astuce utile à retenir pour d'autres langues qui pourraient ne pas avoir l'équivalent de equalsIgnoreCase.

str.toUpperCase().equals(str2.toUpperCase())

Si vous utilisez un alphabet non-romain, prenez note de cette partie de la JavaDoc de equalsIgnoreCase qui dit

Remarquez que cette méthode ne prend pas en compte la localisation et donnera des résultats insatisfaisants pour certaines localités. La classe Collator fournit une comparaison sensible à la localisation.

41 votes

Soyez simplement conscient que les deux solutions ne sont pas nécessairement identiques pour toutes les localisations. String#equalsIgnoreCase n'utilise pas les règles de minuscules spécifiques à la localisation, tandis que String#toLowerCase et #toUpperCase le font.

1 votes

@jarnbjo Pouvez-vous donner un exemple où cette différence est perceptible ?

17 votes

Les règles spécifiques à la langue sont au moins mises en œuvre pour le turc et l'allemand. Le turc considère le I avec et sans point comme deux lettres différentes, créant les paires en majuscules/minuscules i et I alors que d'autres langues considèrent iI comme une paire et n'utilisent pas les lettres and . En allemand, la minuscule ß est capitalisée en "SS".

44voto

Thirler Points 6222

Utilisez 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/

22voto

Aliti Points 264

Vous devez utiliser la méthode compareToIgnoreCase de l'objet String.

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0) cela signifie que str1 est égal à str2.

10voto

KNU Points 359
import java.lang.String; //contient equalsIgnoreCase()
/*
*
*/
String s1 = "Hello";
String s2 = "hello";

if (s1.equalsIgnoreCase(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}

Maintenant, il affichera : hai

2voto

VeenarM Points 630

Notez que vous voudrez peut-être effectuer des vérifications de nullité sur eux également avant d'utiliser vos méthodes .equals ou .equalsIgnoreCase.

Un objet String nul ne peut pas appeler une méthode equals.

par exemple:

public boolean areStringsSame(String str1, String str2)
{
    if (str1 == null && str2 == null)
        return true;
    if (str1 == null || str2 == null)
        return false;

    return str1.equalsIgnoreCase(str2);
}

1 votes

Note : les deux deuxièmes affirmations peuvent être combinées pour produire le même résultat comme ceci : if (str1 == null || str2 == null) return false;.

0 votes

Code modifié pour être plus propre selon le commentaire ci-dessus - longue journée :)

1 votes

Vous pourriez également modifier la première ligne en if (str1 == str2) return true; ce qui prend en compte à la fois les valeurs nulles et raccourcit également le cas où les deux références de chaîne se réfèrent au même objet chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X