Saltar al contenido

Cómo comparar caracteres ignorando mayúsculas y minúsculas en tipos primitivos

Esta es la contestación más exacta que te podemos brindar, pero estúdiala detenidamente y valora si se adapta a tu proyecto.

Solución:

Él Character La clase de API de Java tiene varias funciones que puede usar.

Puede convertir su carácter a minúsculas en ambos lados:

Character.toLowerCase(name1.charAt(i)) == Character.toLowerCase(name2.charAt(j))

También hay métodos que puede usar para verificar si la letra está en mayúsculas o minúsculas:

Character.isUpperCase('P')
Character.isLowerCase('P') 

no puedes Realmente hacer el trabajo bastante bien con toLowerCaseya sea en un string o en un personaje. El problema es que hay variantes de glifos en mayúsculas o minúsculas, y dependiendo de si usa mayúsculas o minúsculas, sus glifos pueden o no conservarse. Ni siquiera está claro lo que tú significar cuando dices que se comparan dos variantes de un glifo en minúscula ignorando mayúsculas y minúsculas: ¿son o no son lo mismo? (Tenga en cuenta que también hay mixed-glifos de caso: u01c5, u01c8, u01cb, u01f2 o Dž, Lj, Nj, Dz, pero cualquier método sugerido aquí funcionará en ellos, siempre y cuando cuenten igual que sus variantes en mayúsculas o minúsculas).

Hay un problema adicional con el uso Char: hay unos 80 puntos de código que no se pueden representar con un solo Char que son variantes en mayúsculas/minúsculas (40 de cada), al menos según lo detectado por el punto de código de Java en mayúsculas/minúsculas. Por lo tanto, debe obtener los puntos de código y cambiar el caso en estos.

Pero los puntos de código no ayudan con los glifos variantes.

De todos modos, aquí hay una lista completa de los glifos que son problemáticos debido a las variantes, que muestra cómo les va frente a los métodos de 6 variantes:

  1. Personaje toLowerCase
  2. Personaje toUpperCase
  3. Cuerda toLowerCase
  4. Cuerda toUpperCase
  5. Cuerda equalsIgnoreCase
  6. Personaje toLowerCase(toUpperCase) (o viceversa)

Para estos métodos, S significa que las variantes se tratan de la misma manera, D significa que las variantes se tratan como diferentes entre sí.

Behavior     Unicode                             Glyphs
===========  ==================================  =========
1 2 3 4 5 6  Upper  Lower  Var Up Var Lo Vr Lo2  U L u l l2
- - - - - -  ------ ------ ------ ------ ------  - - - - -
D D D D S S  u0049 u0069 u0130 u0131         I i İ ı   
S D S D S S  u004b u006b u212a                K k K     
D S D S S S  u0053 u0073        u017f         S s   ſ   
D S D S S S  u039c u03bc        u00b5         Μ μ   µ   
S D S D S S  u00c5 u00e5 u212b                Å å Å     
D S D S S S  u0399 u03b9        u0345 u1fbe  Ι ι   ͅ ι 
D S D S S S  u0392 u03b2        u03d0         Β β   ϐ   
D S D S S S  u0395 u03b5        u03f5         Ε ε   ϵ   
D D D D S S  u0398 u03b8 u03f4 u03d1         Θ θ ϴ ϑ   
D S D S S S  u039a u03ba        u03f0         Κ κ   ϰ   
D S D S S S  u03a0 u03c0        u03d6         Π π   ϖ   
D S D S S S  u03a1 u03c1        u03f1         Ρ ρ   ϱ   
D S D S S S  u03a3 u03c3        u03c2         Σ σ   ς   
D S D S S S  u03a6 u03c6        u03d5         Φ φ   ϕ   
S D S D S S  u03a9 u03c9 u2126                Ω ω Ω     
D S D S S S  u1e60 u1e61        u1e9b         Ṡ ṡ   ẛ   

Para complicar esto aún más, no hay forma de acertar con las I turcas (es decir, las versiones con puntos son diferentes a las versiones sin puntos) a menos que sepa que está en turco; ninguno de estos métodos proporciona el comportamiento correcto y no puede hacerlo a menos que conozca la configuración regional (es decir, no turco: i y I son el mismo caso ignorando; turco, no).

En general, usando toUpperCase le da la aproximación más cercana, ya que solo tiene cinco variantes en mayúsculas (o cuatro, sin contar el turco).

También puede intentar interceptar específicamente esos cinco casos problemáticos y llamar toUpperCase(toLowerCase(c)) en ellos solos. Si eliges tus guardias con cuidado (simplemente toUpperCase Si c < 0x130 || c > 0x212Bluego trabaje con las otras alternativas) puede obtener solo una penalización de velocidad de ~ 20% para los caracteres en el rango bajo (en comparación con ~ 4x si convierte caracteres individuales en cadenas y equalsIgnoreCase ellos) y solo una penalización de 2x si tienes mucho en la zona de peligro. Todavía tienes el problema de configuración regional con puntos I, pero por lo demás estás en buena forma. Por supuesto, si puedes usar equalsIgnoreCase en una más grande stringes mejor que hagas eso.

Aquí hay un código de muestra de Scala que hace el trabajo:

def elevateCase(c: Char): Char =  c >= 0x212A)
    Character.toUpperCase(Character.toLowerCase(c))
  else Character.toUpperCase(c)

Puedes cambiar el caso de String antes de usarlo, así

String name1 = fname.getText().toString().toLowerCase(); 
String name2 = sname.getText().toString().toLowerCase();

Luego continúe con la operación de reposo.

Valoraciones y comentarios

Si para ti ha resultado de provecho nuestro post, nos gustaría que lo compartas con otros desarrolladores de este modo contrubuyes a dar difusión a esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *