Bonjour,
J'ai une petite question qui serait comment le java interprete t il la boucle suivante :
for(String s: mots) System.out.println(" mots: "+s);
C'est bien la première fois que je tombe sur une boucle for de ce style la..
C'est comme un foreach, ça parcoure les éléments d'un sous ensemble
http://php.net/manual/fr/control-structures.foreach.php
https://msdn.microsoft.coom/fr-fr/library/ttw7t8t6.aspx
for(String s: mots){ ... }
Donc la boucle for va parcourir chaque element à l'interieur de mot (tableau ou collection), et l'élément courrant sera contenu dans la variable s, de type String
je voudrais pas dire de connerie parce que j'ai pas trop fait de java mais en tout cas en c++ c'est pour traverser un tableau, donc ta variable "mots" ca sera un tableau de string, et a chaque tour de boucle ca prendra la string suivante, c'est pareil que: for(int i = 0; i != mots.size(); ++i) System.out.println(" mots: " + mots[i]);
D'accord, et dans ce cas si dans le même exercice on a
mots= new Vector<String> ();
String mot;
while(st.hasMoreTokens()) {
mot=st.nextToken();
if (!mots.contains(mot)) mots.add(mot);
}
Pourquoi est ce que on a pas fait
if(!mots.hasMoreTokens(mot)) mot.push(mot);
Je ne comprends pas trop bien le principe de contains et add..
Merci de votre compréhension
Je ne comprends pas trop bien le principe de contains et add..
contains() vérifie si le mot n'est pas déja présent ( vérification par adresse il me semble) et add l'ajoute.
À quoi correspond ton st ? je connais pas hasMoreTokens non plus
st c'etait un Stringtokenizer d'une phrase passée en argument (genre Stringtokenizer st= new StringTokenizer(phrase,",.;:"), en gros cela fractionne la phrase des qu'il rencontre un signe de ponctuation.
Le 10 mars 2016 à 12:07:07 tak9am5ura a écrit :
Bonjour,
J'ai une petite question qui serait comment le java interprete t il la boucle suivante :
for(String s: mots) System.out.println(" mots: "+s);C'est bien la première fois que je tombe sur une boucle for de ce style la..
Avec Java8 tu peux utiliser les streamsmots.stream().forEach(System.out::println);
Ou encoremots.forEach(System.out::println);
Par exemple si tu as une list<String> source et une autre list<String> destination et tu veux ajouter les Strings de source qui ne sont pas dans destinationsource.stream().filter(s -> !destination.contains(s)).forEach(destination::add);
Le code est clair je pense, je filtre toutes les chaines de caractères qui ne sont pas dans destination et je les ajoute après
Le 10 mars 2016 à 13:03:52 kaTk a écrit :
je voudrais pas dire de connerie parce que j'ai pas trop fait de java mais en tout cas en c++ c'est pour traverser un tableau, donc ta variable "mots" ca sera un tableau de string, et a chaque tour de boucle ca prendra la string suivante, c'est pareil que:for(int i = 0; i != mots.size(); ++i) System.out.println(" mots: " + mots[i]);
Sauf qu'une notion existe entre le for simple et le foreach au niveau de la mutabilité. Tu ne peux pas modifier la variable contenu dans le tableau avec un foreach puisqu'en réalité il s'agit d'une copie.
OK merci beaucoup pour toutes ces explications !
Le 10 mars 2016 à 21:29:57 VIeRepublique a écrit :
Le 10 mars 2016 à 13:03:52 kaTk a écrit :
je voudrais pas dire de connerie parce que j'ai pas trop fait de java mais en tout cas en c++ c'est pour traverser un tableau, donc ta variable "mots" ca sera un tableau de string, et a chaque tour de boucle ca prendra la string suivante, c'est pareil que:for(int i = 0; i != mots.size(); ++i) System.out.println(" mots: " + mots[i]);Sauf qu'une notion existe entre le for simple et le foreach au niveau de la mutabilité. Tu ne peux pas modifier la variable contenu dans le tableau avec un foreach puisqu'en réalité il s'agit d'une copie.
Je viens de faire le test, la modification fonctionne :
http://pastebin.com/jWdL4Yui ![]()
Ah ok, ça fonctionne avec les objets mais pas avec les tableaux de primitives, je viens de tester avec un tableau de String et ça ne modifie pas la valeur ![]()
String n'est pas une variable primitive mais un objet immutable comme les Integer, Double, Float, etc... (à ne pas confondre avec int, double, float avec minuscules).
Pour savoir si un objet est mutable, fais un print de l'objet, s'il affiche la référence (ça ressemble à une adresse) il sera mutable, il n'y a qu'avec ArrayList où j'ai un doute.
UnTrucDe..:
toi tu as modifié l'attribu des objets pointés par les copies des références des objets dans ton foreach.
En clair quand tu fais Obj o = new Obj(); tu alloues un espace mémoire pour o et tu lui affectes une référence (ex: Obj@fe5ad0a), donc si tu fais une copie de o disons o2, o2 et o pointeront vers le même objet (o == o2).
Par contre pour revenir au foreach, si tu veux faire o = null; (déréférenciation) ça ne touchera que des copies et non les variables du tableau.
Le 10 mars 2016 à 13:03:52 kaTk a écrit :
je voudrais pas dire de connerie parce que j'ai pas trop fait de java mais en tout cas en c++ c'est pour traverser un tableau, donc ta variable "mots" ca sera un tableau de string, et a chaque tour de boucle ca prendra la string suivante, c'est pareil que:for(int i = 0; i != mots.size(); ++i) System.out.println(" mots: " + mots[i]);
C'est pas pareil dans le sens où sous le capot on a un Iterator, pas une boucle basée sur la longueur du tableau.
Le 10 mars 2016 à 17:03:39 TintinMage a écrit :
Le 10 mars 2016 à 12:07:07 tak9am5ura a écrit :
Bonjour,
J'ai une petite question qui serait comment le java interprete t il la boucle suivante :
for(String s: mots) System.out.println(" mots: "+s);C'est bien la première fois que je tombe sur une boucle for de ce style la..
Avec Java8 tu peux utiliser les streams
mots.stream().forEach(System.out::println);
Ou encoremots.forEach(System.out::println);Par exemple si tu as une list<String> source et une autre list<String> destination et tu veux ajouter les Strings de source qui ne sont pas dans destination
source.stream().filter(s -> !destination.contains(s)).forEach(destination::add);
Le code est clair je pense, je filtre toutes les chaines de caractères qui ne sont pas dans destination et je les ajoute après
En quoi ça répond à la question de l'auteur ? ![]()
Le 12 mars 2016 à 16:02:28 RogerLeCaillou a écrit :
Le 10 mars 2016 à 13:03:52 kaTk a écrit :
je voudrais pas dire de connerie parce que j'ai pas trop fait de java mais en tout cas en c++ c'est pour traverser un tableau, donc ta variable "mots" ca sera un tableau de string, et a chaque tour de boucle ca prendra la string suivante, c'est pareil que:for(int i = 0; i != mots.size(); ++i) System.out.println(" mots: " + mots[i]);C'est pas pareil dans le sens où sous le capot on a un Iterator, pas une boucle basée sur la longueur du tableau.
Le 10 mars 2016 à 17:03:39 TintinMage a écrit :
Le 10 mars 2016 à 12:07:07 tak9am5ura a écrit :
Bonjour,
J'ai une petite question qui serait comment le java interprete t il la boucle suivante :
for(String s: mots) System.out.println(" mots: "+s);C'est bien la première fois que je tombe sur une boucle for de ce style la..
Avec Java8 tu peux utiliser les streams
mots.stream().forEach(System.out::println);
Ou encoremots.forEach(System.out::println);Par exemple si tu as une list<String> source et une autre list<String> destination et tu veux ajouter les Strings de source qui ne sont pas dans destination
source.stream().filter(s -> !destination.contains(s)).forEach(destination::add);
Le code est clair je pense, je filtre toutes les chaines de caractères qui ne sont pas dans destination et je les ajoute aprèsEn quoi ça répond à la question de l'auteur ?
C'est pas une réponse mais une information