Obtener caracteres 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 la posición enésima? Así que en la cadena "foo", si pidiera el carácter con índice 0 devolvería"f".

Nota - en la pregunta anterior, por "carácter" no me refiero al tipo de datos char, 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 forma más ordenada.

 172
Author: Bluefire, 2012-06-27

9 answers

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

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

Para obtener más información, consulte la documentación de Java en String.charAt. Si quieres otro tutorial simple, este o este.

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

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

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

 273
Author: Ricardo Altamirano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 22:18:26

Quieres .charAt()

Aquí hay un tutorial

"mystring".charAt(2)

Devuelve s

Si estás empeñado en tener una cadena, hay un par de maneras de convertir un char 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
Author: ametren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-27 15:52:00

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

 8
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-27 15:40:24

Usted podría utilizar el String.charAt(int index) resultado del método como el parámetro para la cadena .valueOf (char c) .

String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position.
 5
Author: Francisco Spaeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 22:20:51

Es tan simple como:

String charIs = string.charAt(index) + "";
 5
Author: Aqif Hamid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 22:21:33

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 ordenado" que substring() para ser honesto.

 4
Author: fvu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-27 15:45:48

Ninguna de las respuestas propuestas funciona para pares sustitutos utilizados para codificar caracteres fuera del Plano Multiligual Básico Unicode.

Aquí hay un ejemplo usando tres técnicas diferentes para iterar sobre los "caracteres" de una cadena (incl. usando Java 8 stream API). Tenga en cuenta que este ejemplo incluye caracteres del Plano Multilingüe Suplementario Unicode (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 ";

Iteración de caracteres

La primera solución es un bucle simple 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
}

Iteración de puntos de código

La segunda solución utiliza un bucle explícito también, pero el acceso individual codificar puntos con codePointAt e incrementar el índice de bucle en consecuencia 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.
}

Itere sobre puntos de código usando la API de flujo

La tercera solución es básicamente la misma que la segunda, pero usando el flujo Java 8 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 jeroglíficos correctamente), la primera solución no maneja correctamente los caracteres fuera del BMP Unicode. Por otro lado, las otras dos soluciones se ocupan bien de los pares sustitutos.

 4
Author: Sylvain Leroux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 22:24:54

Aquí está el código correcto. Si estás usando 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
Author: silversk8terz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 22:26:26

Así:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);
 -3
Author: Kadar Kabouya Kalo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 19:27:15