Comment comparer personnage ignorant la casse dans les types primitifs
J'écris ces lignes de code:
String name1 = fname.getText().toString();
String name2 = sname.getText().toString();
aru = 0;
count1 = name1.length();
count2 = name2.length();
for (i = 0; i < count1; i++)
{
for (j = 0; j < count2; j++)
{
if (name1.charAt(i)==name2.charAt(j))
aru++;
}
if(aru!=0)
aru++;
}
Je veux comparer le Character
s de deux String
s en ignorant le cas. Simplement à l'aide de IgnoreCase
ne fonctionne pas. L'ajout de '65' ASCII
valeur ne fonctionne pas non plus. Comment puis-je faire cela?
vous pouvez utiliser
Qui travaille dans la langue anglaise, mais pas dans toutes les langues.
Character.toLowerCase
ou Character.toUpperCase
à faire tout en minuscules ou en majuscules et à les comparer.Qui travaille dans la langue anglaise, mais pas dans toutes les langues.
OriginalL'auteur Arush Kamboj | 2012-04-19
Vous devez vous connecter pour publier un commentaire.
La
Caractère
classe de l'API Java dispose de différentes fonctions que vous pouvez utiliser.Vous pouvez convertir votre char en minuscules, des deux côtés:
Il y a aussi des méthodes que vous pouvez utiliser pour vérifier si la lettre est en majuscule ou minuscule:
OriginalL'auteur Shehzad
Vous ne pouvez pas fait faire le travail tout à fait à droite avec
toLowerCase
, soit sur une chaîne ou à un personnage. Le problème, c'est qu'il y a des variantes de glyphes en majuscules ou en minuscules, et selon que vous en majuscules ou en minuscules vos glyphes peuvent ou ne peuvent pas être conservés. Il n'est même pas clair ce que vous dire quand vous dites que deux variantes d'un bas-de-casse glyphe sont comparés ignorant la casse: sont-ils ou ne sont-ils pas les mêmes? (Noter qu'il existe également mélangé glyphes:\u01c5, \u01c8, \u01cb, \u01f2
ou dž, lj, nj, dz, mais toute méthode proposée ici permettra de travailler sur ceux, aussi longtemps qu'ils devraient compter que la même chose que leurs pleinement supérieure ou complète de minuscules variantes.)Il y a un problème supplémentaire avec l'aide de
Char
: il y a 80 points de code non représentable avec un seulChar
qui sont en majuscules/minuscules variantes (40), au moins tel que détecté par Java du point de code en haut/en bas du boîtier. Par conséquent, vous devez obtenir les points de code et de modifier le cas sur ces.Mais les points de code n'aide pas avec les variantes de glyphes.
De toute façon, voici une liste complète des glyphes qui sont problématiques en raison de variantes, en montrant comment ils se comportent à l'encontre de 6 variante méthodes:
toLowerCase
toUpperCase
toLowerCase
toUpperCase
equalsIgnoreCase
toLowerCase(toUpperCase)
(ou vice versa)Pour ces méthodes,
S
signifie que les variantes sont traités de la même manière que de l'autre,D
signifie que les variantes sont considérés comme différents les uns des autres.Ce qui complique encore davantage, c'est que il n'y a aucun moyen d'obtenir le turc j'ai le droit (c'est à dire en pointillés versions différentes de la undotted versions), sauf si vous savez que vous êtes dans le turc; aucune de ces méthodes ne donnent comportement correct et ne peuvent pas, sauf si vous savez de la locale (c'est à dire non-turc:
i
etI
sont les mêmes ignorant la casse; turc, pas).Dans l'ensemble, à l'aide de
toUpperCase
vous donne l'approximation la plus proche, puisque vous avez seulement cinq majuscules variantes (ou quatre, sans compter les turcs).Vous pouvez également essayer spécifiquement pour intercepter les cinq gênants cas et appel
toUpperCase(toLowerCase(c))
à eux seuls. Si vous choisissez votre gardiens de soin (justetoUpperCase
sic < 0x130 || c > 0x212B
, puis de travailler à travers les autres solutions), vous pouvez obtenir une ~20% de la vitesse de pénalité pour les caractères dans la plage basse (par rapport à ~4x si vous convertissez les caractères uniques sur les cordes et lesequalsIgnoreCase
eux), et seul un 2x pénalité si vous avez beaucoup dans la zone de danger. Vous avez encore la locale problème avec pointillésI
, mais sinon, vous êtes dans une forme décente. Bien sûr, si vous pouvez utiliserequalsIgnoreCase
sur une grande chaîne, vous feriez mieux de faire ça.Voici un exemple de code Scala qui fait le travail:
OriginalL'auteur Rex Kerr
Vous pouvez changer le cas de la Chaîne avant de l'utiliser, à l'instar de ce
Puis continuer avec le reste de l'opération.
Méfiez-vous de la turque locale problème.
OriginalL'auteur Azhar Shaikh
Vous pourriez mettre les deux caractères en minuscules et de les comparer.
Faux, puisque la turquie problème: stackoverflow.com/a/13550932/14731
OriginalL'auteur assylias
Vous avez à considérer le turc j'problème lorsque l'on compare les caractères/la mise en minuscules /uppercasing:
Je suggère de convertir à la Chaîne et l'utilisation toLowerCase avec l'invariant de la culture (dans la plupart des cas au moins).
public final static Locale InvariantLocale = new Locale(vide, Vide, Vide);
str.toLowerCase(InvariantLocale)
Voir similaire C#
chaîne de caractères.ToLower() et string.ToLowerInvariant()
Remarque: Ne pas utiliser des chaînes de caractères.equalsIgnoreCase
http://nikolajlindberg.blogspot.co.il/2008/03/beware-of-java-comparing-turkish.html
OriginalL'auteur Dekel
Méthodes génériques pour comparer un char à une position entre 2 chaînes de caractères à ignorer la casse.
Appel de fonction
OriginalL'auteur Siddarth Kanted
C'est la façon dont le JDK n' (adapté de OpenJDK 8, Chaîne de caractères.java/regionMatches):
Je suppose que cela fonctionne pour le turc aussi?
OriginalL'auteur Stefan Reich