Comment appliquer la boucle for-each à chaque caractère d'une chaîne?
donc je veux itérer pour chaque caractère d'une chaîne.
donc j'ai pensé:
for (char c : "xyz")
mais j'obtiens une erreur de compilateur:
MyClass.java:20: foreach not applicable to expression type
Comment faire?
8 réponses
la façon la plus facile de-chaque char
dans un String
est d'utiliser toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
cela vous donne la concision de pour-chaque construction, mais malheureusement String
(qui est immuable) doit effectuer une copie défensive pour générer le char[]
(qui est mutable), Il ya donc une certaine pénalité de coût.
De la documentation :
[
toCharArray()
retourne] un tableau de caractères nouvellement attribué 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 y a des moyens plus verbeux d'itérer sur les caractères dans un tableau (régulier pour boucle, CharacterIterator
, etc) mais si vous êtes prêt à payer le coût toCharArray()
pour-chacun est le plus concis.
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
vous devez convertir l'objet String en un tableau de char en utilisant le 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);
}
une autre solution utile, vous pouvez travailler avec cette chaîne comme tableau de chaîne
for (String s : "xyz".split("")) {
System.out.println(s);
}
Dans Java 8 nous pouvons le résoudre:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
la méthode jars() renvoie un IntStream
comme indiqué dans doc :
renvoie un flux de zéro int-en prolongeant les valeurs de char à partir de ce séquence. Tout code qui correspond à un code de substitution est transmis par le biais de mal interprétés. Si la séquence est mutée pendant que le flux est en étant lu, le résultat n'est pas défini.
Pourquoi utiliser forEachOrdered
et non forEach
?
le comportement de forEach
est explicitement non déterministe lorsque le forEachOrdered
effectue une action pour chaque élément de ce flux, dans ordre de rencontre du flux si le flux a un ordre de rencontre défini. Ainsi forEach
ne garantit pas que la commande serait maintenue. Aussi, cochez cette question pour en savoir plus.
nous pourrions également utiliser codePoints()
pour imprimer, voir cette réponse pour plus de détails.
si vous utilisez Java 8, Vous pouvez utiliser chars()
sur un String
pour obtenir un Stream
de caractères, mais vous devrez lancer le int
de nouveau à un char
comme chars()
retourne un IntStream
.
"xyz".chars().forEach(i -> System.out.print((char)i));
si vous utilisez Java 8 avec Eclipse Collections , vous pouvez utiliser la CharAdapter
classe forEach
méthode avec une lambda ou référence de méthode pour itérer sur tous les caractères dans un String
.
CharAdapter.adapt("xyz").forEach(c -> System.out.print(c));
cet exemple particulier pourrait aussi utiliser une référence de méthode.
CharAdapter.adapt("xyz").forEach(System.out::print)
Remarque: je suis un committer pour Eclipse Collections.
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 traverser 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 manipulation de chaîne en java qui aide à traverser la chaîne pour un caractère spécifique.