Pregunta Obtener carácter de cadena por índice - Java


Sé cómo calcular el índice de un cierto carácter o número en una cadena, pero ¿hay algún método predefinido que pueda usar para darme el carácter en el enésimo ¿posición? Entonces, en la cadena "foo", si pedía el carácter con índice 0, devolvería "f".

Nota: en la pregunta anterior, por "carácter" no me refiero al tipo de datos de caracteres, sino a una letra o número en una cadena. Lo importante aquí es que no recibo un char cuando se invoca el método, sino una cadena (de longitud 1). Y sé sobre el método substring (), pero me preguntaba si había una manera más ordenada.


165
2018-06-27 15:37


origen


Respuestas:


El método que estás buscando es charAt. Aquí hay un ejemplo:

String text = "foo";
char a_char = text.charAt(0);
System.out.println(a_char); // Prints f

Para más información, vea el Documentación de Java en String.charAt. Si quieres otro tutorial simple, éste o éste.

Si no quieres el resultado como un char tipo de datos, sino más bien como una cadena, usaría el Character.toString método:

String text = "foo";
String a_letter = Character.toString(text.charAt(0));
System.out.println( a_letter ); // Prints f

Si quieres más información sobre Character clase y el toString método, saqué mi información de la documentación sobre Character.toString.


260
2018-06-27 15:39



Usted quiere .charAt()

Aquí hay un tutorial

"mystring".charAt(2)

devoluciones s

Si estás empeñado en tener una cuerda, hay un par de maneras de convertir un carácter en una cadena:

String mychar = Character.toString("mystring".charAt(2));

O

String mychar = ""+"mystring".charAt(2);

O incluso

String mychar = String.valueOf("mystring".charAt(2));

Por ejemplo.


35
2018-06-27 15:39



Estás bastante atrapado con substring(), dado sus requisitos. La forma estándar sería charAt(), pero dijiste que no aceptarías un tipo de datos de char.


8
2018-06-27 15:40



Podrías usar el String.charAt(int index) resultado del método como el parámetro para String.valueOf (char c).

String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position.

5
2018-06-27 15:45



Es tan simple como:

String charIs = string.charAt(index) + "";

5
2018-06-27 15:52



Un enfoque híbrido que combina charAt con su requisito de no obtener char podría ser

newstring = String.valueOf("foo".charAt(0));

Pero eso no es realmente "más limpio" que substring() sinceramente.


4
2018-06-27 15:45



Ninguna de las respuestas propuestas funciona para parejas sustitutas utilizadas para codificar caracteres fuera del Plano multiligual básico Unicode.

Aquí hay un ejemplo que utiliza tres técnicas diferentes para iterar sobre los "caracteres" de una cadena (incluido el uso de la API de flujo de Java 8). Tenga en cuenta que este ejemplo incluye caracteres de Unicode Supplementary Multilingual Plane (SMP). Necesita una fuente adecuada para mostrar este ejemplo y el resultado correctamente.

// String containing characters of the Unicode 
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡";

Iterato de caracteres

La primera solución es un simple bucle sobre todo char de la cadena:

/* 1 */
System.out.println(
        "\n\nUsing char iterator (do not work for surrogate pairs !)");
for (int pos = 0; pos < str.length(); ++pos) {
    char c = str.charAt(pos);
    System.out.printf("%s ", Character.toString(c));
    //                       ^^^^^^^^^^^^^^^^^^^^^
    //                   Convert to String as per OP request
}

Iteracion de puntos de codigo

La segunda solución también usa un bucle explícito, pero accediendo a puntos de código con codePointAt e incrementando el índice de bucle de acuerdo a charCount:

/* 2 */
System.out.println(
        "\n\nUsing Java 1.5 codePointAt(works as expected)");
for (int pos = 0; pos < str.length();) {
    int cp = str.codePointAt(pos);

    char    chars[] = Character.toChars(cp);
    //                ^^^^^^^^^^^^^^^^^^^^^
    //               Convert to a `char[]`
    //               as code points outside the Unicode BMP
    //               will map to more than one Java `char`
    System.out.printf("%s ", new String(chars));
    //                       ^^^^^^^^^^^^^^^^^
    //               Convert to String as per OP request

    pos += Character.charCount(cp);
    //     ^^^^^^^^^^^^^^^^^^^^^^^
    //    Increment pos by 1 of more depending
    //    the number of Java `char` required to
    //    encode that particular codepoint.
}

Iteramos los puntos de código usando Stream API

La tercera solución es básicamente la misma que la segunda, pero usando el Java 8 Stream API:

/* 3 */
System.out.println(
        "\n\nUsing Java 8 stream (works as expected)");
str.codePoints().forEach(
    cp -> {
        char    chars[] = Character.toChars(cp);
        //                ^^^^^^^^^^^^^^^^^^^^^
        //               Convert to a `char[]`
        //               as code points outside the Unicode BMP
        //               will map to more than one Java `char`
        System.out.printf("%s ", new String(chars));
        //                       ^^^^^^^^^^^^^^^^^
        //               Convert to String as per OP request
    });

Resultados

Cuando ejecuta ese programa de prueba, obtiene:

Using char iterator (do not work for surrogate pairs !)
T h e   q u i c k   b r o w n   ? ?   j u m p s   o v e r   t h e   l a z y   ? ? ? ? ? ? ? ? 

Using Java 1.5 codePointAt(works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

Using Java 8 stream (works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

Como puede ver (si puede mostrar los jeroglíficos correctamente), la primera solución no maneja correctamente los caracteres fuera del Unicode BMP. Por otro lado, las otras dos soluciones se manejan bien con parejas sustitutas.


4
2017-11-07 22:40



Aquí está el código correcto. Si usa zybooks, esto resolverá todos los problemas.

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}

0
2017-11-21 16:51



Me gusta esto:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);

-3
2018-05-13 18:43