Je veux donc itérer pour chaque caractère d'une chaîne.
Donc je pensais:
for (char c : "xyz")
mais j'obtiens une erreur de compilation:
MyClass.java:20: foreach not applicable to expression type
Comment puis-je faire ceci?
Je veux donc itérer pour chaque caractère d'une chaîne.
Donc je pensais:
for (char c : "xyz")
mais j'obtiens une erreur de compilation:
MyClass.java:20: foreach not applicable to expression type
Comment puis-je faire ceci?
Réponses:
La façon la plus simple de for-each char
in a String
est d'utiliser toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
Cela vous donne la concision de for-each construct, mais malheureusement String
(ce qui est immuable) doit effectuer une copie défensive pour générer le char[]
(qui est mutable), donc il y a une pénalité de coût.
De la documentation :
[
toCharArray()
renvoie] un tableau de caractères nouvellement alloué dont la longueur est la longueur de cette chaîne et dont le contenu est initialisé pour contenir la séquence de caractères représentée par cette chaîne.
Il existe des façons plus verbeuses d'itérer des caractères dans un tableau (boucle for régulière CharacterIterator
, etc.), mais si vous êtes prêt à payer le coût, toCharArray()
chacune est la plus concise.
toCharArray( )
est appelé 3 fois?
211900000
, le temps nécessaire pour terminer for (char c : str.toCharArray()) { }
est d'environ 250 ms et le temps nécessaire pour terminer for (char c : charArray) { }
est <10 ms. Bien sûr, ces valeurs de temps dépendront du matériel, mais le point à retenir est qu'une méthode est beaucoup plus coûteuse que l'autre.
toCharArray()
n'est pas à l'intérieur du corps de la boucle; il n'est appelé qu'une seule fois, puis la boucle itère sur ce tableau résultant. (La boucle for-each est différente de la for
boucle générale , qui évalue la condition d'arrêt à chaque itération.)
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Une autre solution utile, vous pouvez travailler avec cette chaîne en tant que tableau de String
for (String s : "xyz".split("")) {
System.out.println(s);
}
split()
mappés à plus d'un caractère Java, ce qui est le cas pour presque toutes les émoticônes. Par exemple, cette variante de votre exemple fera une boucle quatre fois au lieu de trois:for (String s : "x😁z".split("")) { System.out.println(s); }
Vous devez convertir l'objet String en un tableau de char à l'aide de la toCharArray
méthode () de la classe String:
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}
Dans Java 8, nous pouvons le résoudre comme suit:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
La méthode chars () renvoie un IntStream
comme mentionné dans le doc :
Renvoie un flux de int étendant à zéro les valeurs char de cette séquence. Tout caractère qui correspond à un point de code de substitution est transmis sans être interprété. Si la séquence est mutée pendant la lecture du flux, le résultat n'est pas défini.
forEachOrdered
et nonforEach
?Le comportement de forEach
est explicitement non déterministe où comme forEachOrdered
exécute une action pour chaque élément de ce flux, dans l' ordre de rencontre du flux si le flux a un ordre de rencontre défini. Donc, forEach
ne garantit pas que la commande sera conservée. Vérifiez également cette question pour en plus.
Nous pourrions également utiliser codePoints()
pour imprimer, voir cette réponse pour plus de détails.
Malheureusement, Java ne fait pas de String
mise en œuvre Iterable<Character>
. Cela pourrait facilement être fait. Il y a StringCharacterIterator
mais cela ne met même pas en œuvre Iterator
... Alors faites le vôtre:
public class CharSequenceCharacterIterable implements Iterable<Character> {
private CharSequence cs;
public CharSequenceCharacterIterable(CharSequence cs) {
this.cs = cs;
}
@Override
public Iterator<Character> iterator() {
return new Iterator<Character>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < cs.length();
}
@Override
public Character next() {
return cs.charAt(index++);
}
};
}
}
Maintenant, vous pouvez (un peu) facilement exécuter for (char c : new CharSequenceCharacterIterable("xyz"))
...
Si vous utilisez Java 8, vous pouvez utiliser chars()
sur a String
pour obtenir un Stream
de caractères, mais vous devrez convertir le int
dos en a char
comme renvoyant chars()
un IntStream
.
"xyz".chars().forEach(i -> System.out.print((char)i));
Si vous utilisez Java 8 avec des collections Eclipse , vous pouvez utiliser la méthode de CharAdapter
classe forEach
avec une référence lambda ou une méthode pour parcourir tous les caractères d'un fichier String
.
Strings.asChars("xyz").forEach(c -> System.out.print(c));
Cet exemple particulier pourrait également utiliser une référence de méthode.
Strings.asChars("xyz").forEach(System.out::print)
Remarque: je suis un committer pour les collections Eclipse.
Vous pouvez également utiliser un lambda dans ce cas.
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
Pour Travers une chaîne, vous pouvez également utiliser charAt()
avec la chaîne.
comme :
String str = "xyz"; // given String
char st = str.charAt(0); // for example we take 0 index element
System.out.println(st); // print the char at 0 index
charAt()
est une méthode de gestion des chaînes en java qui aide à parcourir la chaîne pour un caractère spécifique.
for (char st: "xyz".toCharArray()) {}
c'est?