53 votes

Pourquoi la classe String en Java n'implémente-t-elle pas Iterable?

De nombreuses classes d'infrastructure Java implémentent Iterable , mais pas String . Il est logique de parcourir les caractères d'un String , tout comme on peut effectuer une itération sur les éléments d'un tableau classique.

Existe-t-il une raison pour laquelle String n'implémente pas Iterable ?

29voto

Vivin Paliath Points 40975

Il n'y a vraiment pas une bonne réponse. Un itérateur en Java s'applique spécifiquement à une collection d'éléments discrets (des objets). On pourrait penser qu'un String, qui implémente CharSequence, devrait être une "collection" de caractères discrets. Au lieu de cela, il est traité comme une entité unique qui se compose de caractères.

En Java, il semble que les itérateurs ne sont réellement appliquées pour les collections, et pas à une chaîne. Il n'ya aucune raison pourquoi il est de cette façon (près que je peux dire - vous aurait probablement parler Gosling ou de l'API écrivains); il semble convention ou d'une décision de conception. En effet, il n'y a rien de prévenir CharSequence à partir de la mise en œuvre de Iterable.

Cela dit, vous pouvez effectuer une itération sur les caractères dans une chaîne de caractères comme suit:

for (int i = 0; i < str.length(); i++) {
  System.out.println(str.charAt(i));
}

Ou comme d'autres l'ont dit:

for(char c : str.toCharArray()) {
  System.out.println(c);
}

Notez également que vous ne pouvez pas modifier un caractère d'une Chaîne en place, car les Chaînes sont immuables. La mutable compagnon de Chaîne est StringBuilder (plus âgés ou StringBuffer).

MODIFIER

À préciser sur la base des commentaires sur cette réponse. J'essaie d'expliquer, une justification possible pour expliquer pourquoi il n'est pas un Itérateur sur un String. Je ne suis pas en train de dire qu'il n'est pas possible; en effet, je pense qu'il serait judicieux CharSequence à mettre en oeuvre Iterable.

String fournit CharSequence, qui, si seulement sur le plan conceptuel, est différent d'un String. Un String est généralement considéré comme une seule entité, alors qu' CharSequence , c'est exactement cela: une séquence de caractères. Il serait judicieux d'avoir un itérateur sur une séquence de caractères (c'est à dire, sur CharSequence), mais pas simplement sur un String lui-même.

Comme Foxfire a à juste titre relevé dans les commentaires, String implémente l' CharSequence interface, type sage, un String est CharSequence. Du point de vue sémantique, il me semble que ce sont deux choses séparées - je suis probablement d'être pointilleux, mais quand je pense à un String j'ai l'habitude de le penser comme une entité unique qui se compose de caractères. Considérez la différence entre la séquence de chiffres 1, 2, 3, 4 et le nombre 1234. Considérons maintenant la différence entre la corde abcd , et la séquence de caractères a, b, c, d. Je suis en train de pointer du doigt cette différence.

À mon avis, se demandant pourquoi l' String n'ont pas un itérateur, c'est comme demander pourquoi Integer n'ont pas un itérateur de sorte que vous pouvez effectuer une itération sur les chiffres individuels.

13voto

Foxfire Points 4503

La raison en est simple: La classe string est beaucoup plus âgé que Itératif.

Et, évidemment, personne n'a jamais voulu ajouter à l'interface de la Chaîne (qui est un peu étrange parce qu'il n'en œuvre CharSequence qui est basé sur exactement la même idée).

Cependant, il serait un peu imperformant parce que Itérable retourne un objet. Donc, il serait nécessaire de placer tous les caractères retournée.

Edit: Juste comme comparaison: .Net prend en charge l'énumération sur la Chaîne, mais dans .Net Itérable fonctionne également sur les types natifs, donc il n'y a pas d'emballage nécessaire, car elle serait requise en Java.

13voto

Kevin Bourrillion Points 19677

Pour ce que ça vaut, mon collègue et Josh Bloch fortement souhaite ajouter cette fonctionnalité à Java 7:

for (char c : aString) { ... }

et

for (int codePoint : aString) { ... }

Ce serait la façon la plus simple de la boucle sur les chars et plus de logique caractères (points de code) jamais. Il ne nécessite pas de prise de String œuvre Iterable, ce qui obligerait la boxe pour se produire.

Sans que le langage, il n'y a pas vraiment de bonne réponse à ce problème. Et il semble très optimiste qu'il peut en tirer que cela arrive, mais je ne suis pas sûr.

3voto

akuhn Points 12241

Ils ont simplement oublié de le faire.

1voto

medopal Points 5070

Si vous êtes vraiment intéressé à itérer ici:

 String str = "StackOverflow";

for (char c: str.toCharArray()){
     //here you go
}
 

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