Comment appliquer la boucle for-each à chaque caractère d’une chaîne?

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 méthode la plus simple pour chaque caractère d’une Ssortingng consiste à utiliser toCharArray() :

 for (char ch: "xyz".toCharArray()) { } 

Cela vous donne la concision de la construction for-each, mais malheureusement Ssortingng (qui est immuable) doit effectuer une copie défensive pour générer le caractère char[] (qui est modifiable), il y a donc 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 y a des manières plus verbeuses d’itérer sur des caractères dans un tableau (normal pour la boucle, CharacterIterator , etc.) mais si vous êtes prêt à payer le coût toCharArray() pour-chacun est le plus concis.

 Ssortingng s = "xyz"; for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); } 

Vous devez convertir l’object Ssortingng en un tableau de caractères en utilisant la méthode toCharArray () de la classe Ssortingng:

 Ssortingng str = "xyz"; char arr[] = str.toCharArray(); // convert the Ssortingng 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 en tant que tableau de chaîne

 for (Ssortingng s : "xyz".split("")) { System.out.println(s); } 

En Java 8, nous pouvons le résoudre comme suit:

 Ssortingng 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 stream de données int-zero étendant les valeurs de caractère de cette séquence. Tout caractère correspondant à un sharepoint code de substitution est transmis sans être interprété. Si la séquence est mutée pendant la lecture du stream, le résultat est indéfini.

Pourquoi utiliser forEachOrdered et non forEach ?

Le comportement de forEach est explicitement non déterministe lorsque forEachOrdered exécute une action pour chaque élément de ce stream, dans l’ ordre de rencontre du stream si le stream a un ordre de rencontre défini. So forEach ne garantit pas que la commande sera conservée. Vérifiez également cette question pour 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 une Ssortingng pour obtenir un Stream de caractères, mais vous devrez IntStream int en char car chars() renvoie 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 CharAdapter classe forEach avec une référence de méthode lambda ou méthode pour parcourir tous les caractères d’une Ssortingng .

 CharAdapter.adapt("xyz").forEach(c -> System.out.print(c)); 

Cet exemple particulier pourrait également utiliser une référence de méthode.

 CharAdapter.adapt("xyz").forEach(System.out::print) 

Note: Je suis un committer pour les collections Eclipse.

Vous pouvez également utiliser un lambda dans ce cas.

  Ssortingng 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 :

 Ssortingng str = "xyz"; // given Ssortingng 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 de chaîne dans Java qui aide Travers la chaîne pour un caractère spécifique.