2012-06-27 14 views
150

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 nth? Entonces, en la cadena "foo", si pedía el carácter con índice 0, devolvería "f".Obtener caracteres de cadena por índice - Java

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.

+2

Esta es una pregunta muy extraña. – user845279

+9

¿Lo es? La respuesta es bastante simple. – ametren

+0

¿Notaste que no quiere un valor 'char'? Y él sabe cómo hacer 'substring()' pero solo quiere una forma más "nítida". FYI, puedo decir que 'substring()' es la mejor manera. – user845279

Respuesta

233

El método que está 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, ver la Java documentation on String.charAt. Si desea otro tutorial simple, this one o this one.

Si no desea que el resultado como un tipo de datos char, sino más bien como una cadena, se utiliza el método de 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 y la CharactertoString método, sacó mi información de the documentation on Character.toString.

+0

"Lo importante aquí es que no recibo un char cuando se invoca el método, sino una cadena", pero gracias de todos modos (upvote): D – Bluefire

+1

@Bluefire Vea mi edición. –

+0

Creo que la respuesta de Sylvain Leroux es mejor. [Documento sobre Carácter] (https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#unicode) –

33

¿Quieres .charAt()

Here's a tutorial

"mystring".charAt(2) 

vuelve s

Si está empeñado en tener una cadena hay un par de maneras de convertir un char a 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.

+0

Creo que acabas de leer parte de la pregunta. – user845279

+0

Respuesta actualizada. – ametren

+0

@ametren ¿La concatenación de cadena de cadena es preferible a 'Character.toString'? –

7

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

+0

Lo suficiente. Pero, como char es un tipo primitivo, supongo que 'toString()' no funcionará en él, y 'valueOf()' es solo para números (creo que puedo estar equivocado), entonces ¿cómo convierto un char? a una cadena? – Bluefire

+0

"en la pregunta anterior, por" carácter "no me refiero al tipo de datos" - No leo esto como "No aceptaré un' char' " – ametren

+0

@Bluefire See my answer. 'Character.toString' debería funcionar (es un método estático de la clase [' Character'] (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html). –

4

Un enfoque híbrido que combina charAt con su requisito de no conseguir carbón podría ser

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

Pero eso no es realmente "más limpio" que substring() a ser honesto.

5

Es tan simple como:

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

De esta manera:

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

OP indicó que se desea una "Cadena" de longitud 1, ** no ** a 'cabra'. –

+0

Las otras 6 respuestas, incluida la aceptada, sugirieron 'charAt()' como posible solución. ¿Qué significa esta respuesta? add? –

+5

Además, parece que está insinuando que 'charAt()' usa índices basados ​​en 1, al tener el único carácter diferente en 'a' en la tercera posición. Si eso fuera cierto, entonces sería mejor para usted puede decirlo o explicarlo en vez de insinuarlo. En realidad eso es * no * verdadero: 'charAt()' usa índices basados ​​en 0, entonces 's' será''h''. –

3

Ninguna de las respuestas propuestas trabaja para los pares suplentes utilizados para codificar caracteres fuera del Unicode Basic Multiligual Plane.

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 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 "; 

Iterar de caracteres

La primera solución es un bucle simple a través de toda 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 
} 

Iterar de puntos de código

La segunda solución utiliza un bucle explícito también, 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. 
} 

iterar sobre los puntos de código utilizando el API corriente

La tercera solución es básicamente la misma que la segunda, pero utilizando 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 visualizar 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.

0

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); 
    } 
} 
Cuestiones relacionadas