Obtener caracteres de cadena por índice - Java

231

Sé cómo calcular el índice de un determinado 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 enésima posición? Entonces, en la cadena "foo", si preguntara por 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 carácter 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.

Fuego azul
fuente
13
¿Es? La respuesta es bastante directa.
ametren
¿Notaste que no quiere un charvalor? Y él sabe cómo hacerlo, substring()pero solo quiere una forma "más ordenada". Para su información, puedo decir que substring()es la mejor manera.
user845279
3
@ user845279 Character.toStringcumple con todos los requisitos necesarios y no es desordenado en absoluto.
Ricardo Altamirano
@pythonscript Estoy de acuerdo, pero no es muy diferente de usar substring()directamente.
user845279
1
Llego tarde a esta fiesta, pero @RicardoAltamirano está un poco equivocado. El endIndex(segundo parámetro) de String.substring(int, int)es un índice exclusivo , y no arrojará una excepción durante el index + 1tiempo index < length()que sea cierto, incluso para el último carácter de la cadena.
William Price

Respuestas:

340

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

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

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

Si no desea el resultado como un chartipo de datos, sino como una cadena, usaría el Character.toStringmétodo:

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

Si desea más información sobre la Characterclase y el toStringmétodo, extraje mi información de la documentación en Character.toString .

Ricardo Altamirano
fuente
1
"Lo importante aquí es que no recibo un char cuando se invoca el método, sino una cadena", pero gracias de todos modos (
voto positivo
1
Creo que la respuesta de Sylvain Leroux es mejor. documento sobre el personaje
Chaojun Zhong
Estoy de acuerdo con @ChaojunZhong, esta es una respuesta más adecuada ya que no es aconsejable usar charAt () porque tendrías problemas cuando tienes caracteres que necesitan 2 unidades de código.
bpunzalan
43

Usted quiere .charAt()

Aquí hay un tutorial

"mystring".charAt(2)

devoluciones s

Si estás empeñado en tener una cadena, hay un par de formas 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.

ametren
fuente
@ametren ¿Es preferible la concatenación de cadenas de cadenas Character.toString?
Ricardo Altamirano
Creo que eso puede deberse a una cuestión de preferencia personal. También podrías hacerloString mychar = String.valueOf("mystring".charAt(2));
ametren
En resumen, mi preferencia personal en este caso sería String mychar = ""+"mystring".charAt(2);porque es la más concisa. Otros diferirán en su opinión sobre esto.
ametren
10

Ninguna de las respuestas propuestas funciona para pares sustitutos utilizados para codificar caracteres fuera del plano multiligual básico Unicode .

Aquí hay un ejemplo que usa tres técnicas diferentes para iterar sobre los "caracteres" de una cadena (incluido el uso de 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 toda charla 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 también usa un bucle explícito, pero accede a puntos de código individuales con codePointAt e incrementa el índice del bucle de acuerdo con 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.
}

Iterar sobre puntos de código usando la API Stream

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

/* 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 BMP de Unicode. Por otro lado, las otras dos soluciones tratan bien con pares sustitutos.

Sylvain Leroux
fuente
8

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

Thomas
fuente
Lo suficientemente justo. Pero, dado que char es un tipo primitivo, supongo toString()que no funcionará en él, y valueOf()es solo para números (creo que puedo estar equivocado), entonces, ¿cómo convierto un char en una cadena?
Bluefire
"en la pregunta anterior, por" carácter "no me refiero al tipo de datos char" - No leo esto como "No aceptaré un char"
ametren
@Bluefire Mira mi respuesta. Character.toStringdebería funcionar (es un método estático de la Characterclase.
Ricardo Altamirano
5

Un enfoque híbrido que se combine charAtcon 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()ser sincero.

fvu
fuente
5

Es tan simple como:

String charIs = string.charAt(index) + "";
Aqif Hamid
fuente
4

Aquí está el código correcto. Si está utilizando 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);
    }
}
silversk8terz
fuente
0

Si alguien está luchando con Kotlin, el código es:

var oldStr: String = "kotlin"
var firstChar: String = oldStr.elementAt(0).toString()
Log.d("firstChar", firstChar.toString())

esto devolverá el carácter en la posición 1, en este caso k recuerde, el índice comienza en la posición 0, por lo que en esta muestra: kotlin sería k = posición 0, o = posición 1, t = posición 2, l = posición 3, i = posición 4 yn = posición 5

Thiago Silva
fuente
-3

Me gusta esto:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);
Kadar Kabouya Kalo
fuente
OP declaró que Stringse desea una longitud 1, no una char.
William Price
Las otras 6 respuestas, incluida la aceptada, se sugirieron charAt()como una posible solución. ¿Qué agrega esta respuesta?
Dan Getz
66
Además, parece que estás insinuando que charAt()usa índices basados ​​en 1, al tener el único personaje diferente aen la tercera posición. Si eso fuera cierto, entonces sería mejor para usted decirlo o explicarlo que insinuarlo. En realidad, eso no es cierto: charAt()usa índices basados ​​en 0, así sserá 'h'.
Dan Getz