219 votes

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.

Alors j'ai pensé :

for (char c : "xyz")

mais je reçois une erreur de compilation :

MyClass.java:20: foreach not applicable to expression type

Comment puis-je le faire ?

6voto

akhil_mittal Points 40

En Java 8 on peut 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 doc :

Renvoie un flux d'int qui prolonge de zéro les valeurs char de cette séquence. Tout caractère qui correspond à un point de code de substitution est passé passe sans être interprété. Si la séquence est modifiée pendant que le flux est le flux est lu, le résultat est indéfini.

Pourquoi utiliser forEachOrdered et non forEach ?

Le comportement de forEach est explicitement non déterministe, alors que la fonction forEachOrdered exécute une action pour chaque élément de ce flux, dans l'ordre suivant ordre de rencontre du flux si le flux a un ordre de rencontre défini. Ainsi, forEach ne garantit pas que l'ordre sera respecté. Vérifiez également ceci question pour plus.

Nous pourrions également utiliser codePoints() pour imprimer, voir ceci responder pour plus de détails.

4voto

Ossifer Points 41

Malheureusement, Java ne fait pas String mettre en œuvre Iterable<Character> . Cela pourrait facilement être fait. Il y a StringCharacterIterator mais cela n'implémente même pas Iterator ... Alors fais le tien :

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 (assez) facilement exécuter for (char c : new CharSequenceCharacterIterable("xyz")) ...

2voto

ander4y748 Points 23

Vous pouvez également utiliser un lambda dans ce cas.

    String s = "xyz";
    IntStream.range(0, s.length()).forEach(i -> {
        char c = s.charAt(i);
    });

-7voto

user1690439 Points 1

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 traitement des chaînes de caractères en java qui permet de parcourir la chaîne de caractères à la recherche d'un caractère spécifique.

2 votes

Savez-vous ce que for (char st: "xyz".toCharArray()) {} est ?

0 votes

-1 hors sujet (sujet : for-each), et utiliser charAt au lieu de charAT

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X