Obtenir le caractère de chaîne par index - Java


231

Je sais comment calculer l'index d'un certain caractère ou nombre dans une chaîne, mais existe-t-il une méthode prédéfinie que je puisse utiliser pour me donner le caractère à la nième position? Donc, dans la chaîne "foo", si je demandais le caractère avec l'index 0, il retournerait "f".

Remarque - dans la question ci-dessus, par "caractère", je ne veux pas dire le type de données char, mais une lettre ou un chiffre dans une chaîne. L'important ici est que je ne reçois pas de caractère lorsque la méthode est invoquée, mais une chaîne (de longueur 1). Et je connais la méthode substring (), mais je me demandais s'il y avait une manière plus nette.


13
C'est? La réponse est assez simple.
ametren

Avez-vous remarqué qu'il ne veut pas de charvaleur? Et il sait comment faire, substring()mais veut juste une façon "plus soignée". Pour info, je peux dire que substring()c'est la meilleure façon.
user845279

3
@ user845279 Character.toStringremplit toutes les conditions requises et n'est pas du tout compliqué .
Ricardo Altamirano

@pythonscript Je suis d'accord, mais ce n'est pas très différent de l'utilisation substring()directe.
user845279

1
Je suis en retard à cette fête, mais @RicardoAltamirano se trompe un peu. Le endIndex(deuxième paramètre) de String.substring(int, int)est un index exclusif , et il ne lèvera pas d'exception index + 1aussi longtemps que index < length()- ce qui est vrai même pour le dernier caractère de la chaîne.
William Price

Réponses:


340

La méthode que vous recherchez est charAt. Voici un exemple:

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

Pour plus d'informations, consultez la documentation Java surString.charAt . Si vous voulez un autre tutoriel simple, celui-ci ou celui-ci .

Si vous ne voulez pas que le résultat soit un chartype de données, mais plutôt une chaîne, vous utiliserez la Character.toStringméthode:

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

Si vous voulez plus d'informations sur la Characterclasse et la toStringméthode, j'ai tiré mes informations de la documentation sur Character.toString .


1
"L'important ici est que je ne reçois pas de caractère lorsque la méthode est invoquée, mais une chaîne", mais merci quand même (vote positif): D
Bluefire

1
Je pense que la réponse de Sylvain Leroux est meilleure. doc sur le personnage
Chaojun Zhong

Je suis d' accord avec @ChaojunZhong c'est une réponse plus appropriée car il est déconseillé d'utiliser charAt () parce que vous auriez des problèmes lorsque vous avez des personnages qui a besoin de 2 unités de code.
bpunzalan

43

Tu veux .charAt()

Voici un tutoriel

"mystring".charAt(2)

Retour s

Si vous êtes déterminé à avoir une chaîne, il existe deux façons de convertir un caractère en chaîne:

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

Ou

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

Ou même

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

Par exemple.


@ametren La concaténation de chaînes de chaînes est-elle préférable à Character.toString?
Ricardo Altamirano

Je pense que cela peut se résumer à une question de préférence personnelle. Vous pourriez aussi faireString mychar = String.valueOf("mystring".charAt(2));
ametren

Pour empiler, ma préférence personnelle dans ce cas serait String mychar = ""+"mystring".charAt(2);parce que c'est la plus concise. D'autres auront une opinion différente à ce sujet.
ametren

10

Aucune des réponses proposées ne fonctionne pour les paires de substitution utilisées pour coder des caractères en dehors du plan multilingue multilingue .

Voici un exemple utilisant trois techniques différentes pour parcourir les "caractères" d'une chaîne (y compris en utilisant l'API de flux Java 8). Veuillez noter que cet exemple inclut des caractères du plan multilingue supplémentaire (SMP) Unicode. Vous avez besoin d'une police appropriée pour afficher correctement cet exemple et le résultat.

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

Itération des caractères

La première solution est une simple boucle sur toute charla chaîne:

/* 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
}

Itération de points de code

La deuxième solution utilise également une boucle explicite, mais en accédant aux points de code individuels avec codePointAt et en incrémentant l'index de la boucle en fonction de 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.
}

Itérer sur des points de code à l'aide de l'API Stream

La troisième solution est essentiellement la même que la seconde, mais en utilisant l' 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
    });

Résultats

Lorsque vous exécutez ce programme de test, vous obtenez:

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   𓊃 𓍿 𓅓 𓃡 

Comme vous pouvez le voir (si vous pouvez afficher correctement les hiéroglyphes), la première solution ne gère pas correctement les caractères en dehors du BMP Unicode. D'un autre côté, les deux autres solutions conviennent bien aux paires de substitution.


8

Vous êtes assez coincé avec substring(), compte tenu de vos besoins. La méthode standard serait charAt(), mais vous avez dit que vous n'accepteriez pas un type de données char.


C'est suffisant. Mais, puisque char est un type primitif, je suppose que toString()cela ne fonctionnera pas, et valueOf()ne concerne que les nombres (je pense que je peux me tromper), alors comment convertir un char en chaîne?
Bluefire

"dans la question ci-dessus, par" caractère ", je ne veux pas dire le type de données char" - je ne lis pas ceci comme "je n'accepterai pas char"
ametren

@Bluefire Voir ma réponse. Character.toStringdevrait fonctionner (c'est une méthode statique de la Characterclasse.
Ricardo Altamirano


5

Une approche hybride combinant charAtavec votre exigence de ne pas obtenir d'omble pourrait être

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

Mais ce n'est pas vraiment "plus propre" que substring()pour être honnête.


5

C'est aussi simple que:

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

4

Voici le bon code. Si vous utilisez des zybooks, cela répondra à tous les problèmes.

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

0

si quelqu'un se débat avec kotlin, le code est:

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

cela renverra le caractère en position 1, dans ce cas k souvenez-vous, l'index commence en position 0, donc dans cet exemple: kotlin serait k = position 0, o = position 1, t = position 2, l = position 3, i = position 4 et n = position 5


-3

Comme ça:

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

OP a déclaré qu'un a Stringde longueur 1 est souhaité, pas un char.
William Price

Les 6 autres réponses, dont celle acceptée, suggèrent charAt()une solution possible. Qu'est-ce que cette réponse ajoute?
Dan Getz

6
En outre, il semble que vous laissiez entendre que charAt()des indices basés sur 1 sont utilisés, en ayant le seul caractère différent aen troisième position. Si cela était vrai, il serait préférable pour vous de dire ou d'expliquer cela plutôt que d'y faire allusion. En réalité, ce n'est pas vrai: charAt()utilise des indices basés sur 0, ce ssera le cas 'h'.
Dan Getz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.