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.

Feu bleu
la source
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 .

Ricardo Altamirano
la source
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 source
@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.

Sylvain Leroux
la source
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.

Thomas
la source
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.

fvu
la source
5

C'est aussi simple que:

String charIs = string.charAt(index) + "";
Aqif Hamid
la source
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);
    }
}
silversk8terz
la source
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

Thiago Silva
la source
-3

Comme ça:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);
Kadar Kabouya Kalo
la source
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