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.
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 .
Vous voulez .charAt()
"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.
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.
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 ????????????????";
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
}
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.
}
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
});
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.
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.
C'est aussi simple que:
String charIs = string.charAt(index) + "";
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.
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);
}
}
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