web-dev-qa-db-fra.com

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

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

Remarque - dans la question ci-dessus, par "caractère", je ne parle pas du type de données char, mais d'une lettre ou d'un chiffre dans une chaîne. La chose importante ici est que je ne reçois pas un 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 existait une méthode plus nette.

210
Bluefire

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, reportez-vous à la documentation Java sur String.charAt . Si vous voulez un autre tutoriel simple, celui-ci ou celui-ci .

Si vous ne voulez pas le résultat sous la forme d'un type de données char, mais plutôt sous la forme d'une chaîne, utilisez la méthode Character.toString:

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

Si vous voulez plus d'informations sur les classes Character et toString, j'ai extrait mes informations de la documentation sur Character.toString .

323
Ricardo Altamirano

Vous voulez .charAt()

Voici un tutoriel

"mystring".charAt(2)

retourne s

Si vous voulez vraiment avoir une chaîne, il existe plusieurs 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.

39
ametren

Vous êtes plutôt 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.

8
Thomas

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

Voici un exemple utilisant trois techniques différentes pour parcourir les "caractères" d'une chaîne (y compris à l'aide de 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 cet exemple et le résultat correctement.

// 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 de personnages

La première solution est une simple boucle sur tout char de la 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 accède à des points de code individuels avec codePointAt et incrémente l'index de la boucle en conséquence 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 les points de code à l'aide de l'API Stream

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

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 constater (si vous êtes capable d'afficher correctement les hiéroglyphes), la première solution ne gère pas correctement les caractères en dehors du BMP Unicode. Par ailleurs, les deux autres solutions s’appliquent bien aux paires de substitution.

8
Sylvain Leroux

Vous pouvez utiliser le résultat de la méthode String.charAt(int index) comme paramètre pour String.valueOf (char c) .

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

C'est aussi simple que:

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

Une approche hybride combinant charAt avec votre exigence de ne pas obtenir de caractère pourrait être

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

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

4
fvu

Voici le bon code. Si vous utilisez 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);
    }
}
2
silversk8terz

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

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

cela retournera le caractère en position 1, dans ce cas k rappelez-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

0
Thiago Silva