in

java – ¿Cómo puedo comprobar si aparece un solo carácter en una cadena?

apple touch icon@2

String.contains(String) o String.indexOf(String) – sugirió

"abc".contains("Z"); // false - correct
"zzzz".contains("Z"); // false - correct
"Z".contains("Z"); // true - correct
"😀and😀".contains("😀"); // true - correct
"😀and😀".contains("😂"); // false - correct
"😀and😀".indexOf("😀"); // 0 - correct
"😀and😀".indexOf("😂"); // -1 - correct

String.indexOf(int) y cuidadosamente considerado String.indexOf(char) con char para int ensanchamiento

"😀and😀".indexOf("😀".charAt(0)); // 0 though incorrect usage has correct output due to portion of correct data
"😀and😀".indexOf("😂".charAt(0)); // 0 -- incorrect usage and ambiguous result
"😀and😀".indexOf("😂".codePointAt(0)); // -1 -- correct usage and correct output

Las discusiones sobre el carácter son ambiguas en el mundo de Java.

puede el valor de char o Character considerado como un solo personaje?

No. En el contexto de caracteres Unicode, char o Character a veces puede ser part of a single character y no debe ser tratado como a complete single character lógicamente.

si no es así, ¿qué debería considerarse como un solo carácter (lógicamente)?

Cualquier sistema que admita codificaciones de caracteres para caracteres Unicode debe considerar el punto de código Unicode como un solo carácter.

Así que Java debería hacerlo muy claro y fuerte en lugar de exponer demasiados detalles de implementación interna a los usuarios.

String La clase es mala en abstracción (aunque requiere una cantidad confusamente buena de understanding of its encapsulations to understand the abstraction 😒😒😒 y por lo tanto un anti-pattern).

¿En qué se diferencia de lo general? char ¿uso?

char solo se puede asignar a un personaje en el plano multilingüe básico.

Solamente codePoint - int puede cubrir la gama completa de caracteres Unicode.

¿Por qué es esta diferencia?

char se trata internamente como 16-bit valor sin firmar y no pudo representar todos los caracteres Unicode usando la representación interna UTF-16 usando solo 2-bytes. A veces, los valores en un 16-bit la gama debe combinarse con otra 16-bit valor para definir correctamente el carácter.

Sin llegar a ser demasiado detallado, el uso de indexOf, charAt, length y esos métodos deberían ser más explícitos. Sinceramente espero que Java agregue nuevos UnicodeString y UnicodeCharacter clases con abstracciones claramente definidas.

Razón para preferir contains y no indexOf(int)

  1. Prácticamente hay muchos flujos de código que tratan un carácter lógico como char en java.
  2. En contexto Unicode, char No es suficiente
  3. Aunque el indexOf toma un int, char para int la conversión enmascara esto del usuario y el usuario podría hacer algo como str.indexOf(someotherstr.charAt(0))(a menos que el usuario conozca el contexto exacto)
  4. Entonces, tratar todo como CharSequence (también conocido como String) es mejor
    public static void main(String[] args) {
        System.out.println("😀and😀".indexOf("😀".charAt(0))); // 0 though incorrect usage has correct output due to portion of correct data
        System.out.println("😀and😀".indexOf("😂".charAt(0))); // 0 -- incorrect usage and ambiguous result
        System.out.println("😀and😀".indexOf("😂".codePointAt(0))); // -1 -- correct usage and correct output
        System.out.println("😀and😀".contains("😀")); // true - correct
        System.out.println("😀and😀".contains("😂")); // false - correct
    }

Semántica

  1. char puede manejar la mayoría de los casos prácticos de uso. Aún así, es mejor usar puntos de código dentro del entorno de programación para una futura extensibilidad.
  2. codepoint debería manejar casi todos los casos de uso técnico relacionados con las codificaciones.
  3. Todavía, Clústeres de grafemas cae fuera del alcance de codepoint nivel de abstracción.
  4. Las capas de almacenamiento pueden elegir char interfaz si intLos s son demasiado costosos (duplicados). A menos que el costo de almacenamiento sea la única métrica, es mejor usarla codepoint. Además, es mejor tratar el almacenamiento como byte y delegar la semántica a la lógica empresarial basada en el almacenamiento.
  5. La semántica se puede abstraer en múltiples niveles. codepoint debería convertirse en el nivel más bajo de interfaz y se pueden construir otras semánticas alrededor codepoint en el entorno de ejecución.

Deja una respuesta

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

MySQL – Cláusula WHERE

gfg 200x200 min

GTX vs RTX – ¿Cuál es mejor?