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?
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 terminerfor (char c : str.toCharArray()) { }
est d'environ 250 ms et le temps nécessaire pour terminerfor (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 lafor
boucle générale , qui évalue la condition d'arrêt à chaque itération.)la source
Une autre solution utile, vous pouvez travailler avec cette chaîne en tant que tableau de String
la source
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:la source
Dans Java 8, nous pouvons le résoudre comme suit:
La méthode chars () renvoie un
IntStream
comme mentionné dans le doc :Pourquoi utiliser
forEachOrdered
et nonforEach
?Le comportement de
forEach
est explicitement non déterministe où commeforEachOrdered
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.la source
Malheureusement, Java ne fait pas de
String
mise en œuvreIterable<Character>
. Cela pourrait facilement être fait. Il y aStringCharacterIterator
mais cela ne met même pas en œuvreIterator
... Alors faites le vôtre:Maintenant, vous pouvez (un peu) facilement exécuter
for (char c : new CharSequenceCharacterIterable("xyz"))
...la source
Si vous utilisez Java 8, vous pouvez utiliser
chars()
sur aString
pour obtenir unStream
de caractères, mais vous devrez convertir leint
dos en achar
comme renvoyantchars()
unIntStream
.Si vous utilisez Java 8 avec des collections Eclipse , vous pouvez utiliser la méthode de
CharAdapter
classeforEach
avec une référence lambda ou une méthode pour parcourir tous les caractères d'un fichierString
.Cet exemple particulier pourrait également utiliser une référence de méthode.
Remarque: je suis un committer pour les collections Eclipse.
la source
Vous pouvez également utiliser un lambda dans ce cas.
la source
Pour Travers une chaîne, vous pouvez également utiliser
charAt()
avec la chaîne.comme :
charAt()
est une méthode de gestion des chaînes en java qui aide à parcourir la chaîne pour un caractère spécifique.la source
for (char st: "xyz".toCharArray()) {}
c'est?