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 ?

392voto

polygenelubricants Points 136838

La façon la plus simple de for-each chaque char dans un String est d'utiliser toCharArray() :

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

Ceci vous donne la concision de la construction for-each, mais malheureusement String (qui est immuable) doit effectuer une copie défensive pour générer l'image char[] (qui est mutable), donc il y a une certaine pénalité de coût.

Desde el documentation :

[ toCharArray() retours] 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 moyens plus verbeux d'itérer sur les caractères d'un tableau (boucle for classique), CharacterIterator etc.) mais si vous êtes prêt à payer le prix toCharArray() for-each est le plus concis.

2 votes

Le compilateur reconnaîtra-t-il qu'une copie réelle n'est pas nécessaire et appliquera-t-il les optimisations appropriées ?

1 votes

@Pacerier Non, les compilateurs Java actuels n'optimiseront jamais le code.

1 votes

Donc, dans ce cas toCharArray( ) est appelé 3 fois ?

57voto

Matthew Flaschen Points 131723
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
   char c = s.charAt(i);
}

8 votes

L'OP s'attend à ce qu'il y ait de l'argent pour la boucle.

4 votes

Voté bas parce que ce n'est pas ce que le PO a demandé. Bien que cette solution soit valable, ce n'est pas du tout ce qui est demandé.

2 votes

Peu importe ce que l'OP attendait, cela a de meilleures performances que for-each je suppose.

11voto

kyxap Points 174

Une autre solution utile, vous pouvez travailler avec cette chaîne comme un tableau de chaînes.

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

7voto

codaddict Points 154968

Vous devez convertir l'objet String en un tableau de caractères en utilisant la fonction toCharArray () 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);
}

7voto

Donald Raab Points 742

Si vous utilisez Java 8, vous pouvez utiliser chars() sur un String pour obtenir un Stream de caractères, mais vous devrez lancer les int à un char comme chars() renvoie un IntStream .

"xyz".chars().forEach(i -> System.out.print((char)i));

Si vous utilisez Java 8 avec Collections Eclipse vous pouvez utiliser l'option CharAdapter classe forEach avec un lambda ou une référence de méthode pour itérer sur 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)

Note : Je suis un committer pour Eclipse Collections.

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