Obtener carácter de cadena por índice – Java

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 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.

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 obtener más información, consulte la documentación de Java en String.charAt . Si quieres otro tutorial simple, este o este .

Si no quiere el resultado como un tipo de datos char , sino como una cadena, debería usar 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 obtener más información sobre la clase Character y el método toString , extraje mi información de la documentación en Character.toString .

Quieres .charAt()

Aquí hay un tutorial

 "mystring".charAt(2) 

devuelve 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.

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

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

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

Es tan simple como:

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

Un enfoque híbrido que combine 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 la substring() para ser honesto.

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 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 el 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 utiliza un bucle explícito, pero accediendo a puntos de código individuales con codePointAt e incrementando el índice de bucle según 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 con 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 progtwig de prueba, obtiene:

 Using char iterator (do not work for surrogate pairs !) T hequickbrown ? ? jumpsoverthelazy ? ? ? ? ? ? ? ? Using Java 1.5 codePointAt(works as expected) T hequickbrown 𓃥 jumpsoverthelazy 𓊃 𓍿 𓅓 𓃡 Using Java 8 stream (works as expected) T hequickbrown 𓃥 jumpsoverthelazy 𓊃 𓍿 𓅓 𓃡 

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.

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

 for (int i = 0; i 

Me gusta esto:

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