IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Demande d'aide.. nouveau chez vous les Javaien(ne)s


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Par défaut Demande d'aide.. nouveau chez vous les Javaien(ne)s
    Bonjour
    voila un petit code java pour échanger deux valeurs mais ça ne marche pas, je ne sais pas pourquoi????
    Aidez-moi à trouver l'erreur SVP..
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package metier;
     
    import java.util.Scanner;
     
    public class MethodeEchangeValeurs {
     
    	public static void main(String[] args) {
    		int a, b;
    		Scanner clavier = new Scanner(System.in);
    		System.out.print("Entrez une valeur pour a : ");
    		a = clavier.nextInt();
    		System.out.print("Entrez une valeur pour b : ");
    		b = clavier.nextInt();	
    		System.out.println("a = " + a + " et b = " + b);
    		echange(a,b);
    		System.out.println("Après  l'échange ");
    		System.out.println("a = " + a + " et b = " + b);
    	}
     
    	public static void echange(int x, int y) {
    		int tmp = x;
    		x=y;
    		y=tmp;
    	}
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    En Java, les paramètres des méthodes sont passés :

    1. par valeur pour des types primitifs (comme int par exemple). Donc changer la valeur dans le code de la méthode n'impacte pas le code appelant.
    2. par copie de référence pour les types objets. Donc changer la valeur (une référence d'objet) n'impacte pas le code appelant.


    Dans les deux cas, la modification de la valeur d'une variable par affectation n'a aucun effet sur le code appelant la méthode. Dans le cas d'un int, tu modifies la valeur du paramètre localement à la méthode, mais les variables du code appelant ne sont pas affectées (ce sont d'autres variables qui n'ont rien à voir en mémoire). Dans le cas d'un objet, l'affectation d'une nouvelle instance au paramètre n'a aucun effet sur la variable dans le code appelant. Mais comme la référence de l'objet est bien copiée dans le paramètre, la modification d'un attribut de l'objet est bien effective (c'est bien le même objet dans le code appelant et le code appelé).

    Pour le cas particulier d'une méthode qui fait un échange des valeurs de deux variables, on ne peut pas le faire, puisqu'il n'est pas possible de modifier les valeurs des variables du code appelant. La solution sera de passer un conteneur : un objet qui va contenir des attributs qui auront les valeurs à échanger, par exemple dans deux variables, dont on pourra alors changer le valeurs.

    Ce genre de méthode est donc difficile à écrire de façon concise en Java.

    Par exemple, on peut utiliser un tableau (en guise de conteneur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void echanger(int[] var) {
        int echanger = var[0];
        var[0]=var[1];
        var[1]=echanger;
    }
    Mais l'appel est fastidieux et non transparent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int a=1;
    int b=2;
    int[] tab = {a;b};
    echanger(tab);
    a=tab[0];
    b=tab[1];
    De la même façon, le code est similaire au niveaux des affectations pour une classe avec deux attributs.

    Pour un code plus concis, il y a une combine du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int echanger(int a, int b) {
          return b;
    }
    mais qui oblige quand même à faire un appel spécial, donc pas très transparent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a=1; 
    int b=2;
    a = echanger(b, b=a);
    On peut faire aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void echanger(AtomicInteger a, AtomicInteger b){
        a.set(b.getAndSet(a.get()));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AtomicInteger a = new AtomicInteger(1);
    AtomicInteger b = new AtomicInteger(2);
    echanger(a,b);
    Dans ce cas, les valeurs des variables a et b (qui sont des références d'objets) du code appelant ne sont pas modifiées, mais les variables qu'elles contiennent (des attributs des objets), qui valent les valeurs qu'on gère (le 1 et le 2) sont bien affectées, et donc on a bien échange de valeurs dans le code appelant (mais pas des objets).

    Si on a vraiment besoin de ce genre de chose dans un algorithme (échanger 2 variables), on pourra faire une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class Couple<T,T> {
     
        private T a;
        private T b;
     
        public Couple(T a, T b) {
             this.a=a;
             this.b=b;
        }
     
        public T getA() {
              return a;
        }
     
        public T getB() {
              return b;
        }
     
        public void swap() {
              T e=a;
              a=b;
              b=e;
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Couple<Integer,Integer> couple = new Couple<>(1,2);
    couple.swap(couple);
    System.out.println( couple.getA() + " "+ couple.getB()); // affiche 2 1
    Une autre solution serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Wrapper<T> {
       private T value;
       public Wrapper(T value) {
              this.value=value;
       }
       public T getValue() {
            return value;
       }
       public void swap(Wrapper<T> other) {
             T temp = other.value;
             other.value=this.value;
             this.value=temp;
       }
       public String toString() {
            return String.valueOf(value);
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Wrapper<Integer> a = new Wrapper<>(1);
    Wrapper<Integer> b = new Wrapper<>(2);
    a.swap(b);

    Enfin, on peut aussi procéder avec une List, par décalage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
              List<Integer> l = new ArrayList<>(Arrays.asList(1,2));
              shiftLeft(l);
              System.out.println(l);
    	}
     
    	public static <T> void shiftLeft(List<T> list) {
    		if ( list.size()>1 ) {
    			list.add(list.remove(0));
    		}
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Bouton en + dans les demandes d'aide
    Par stolx_10 dans le forum Evolutions du club
    Réponses: 3
    Dernier message: 06/10/2006, 16h29
  2. Réponses: 4
    Dernier message: 31/08/2006, 16h31
  3. Demande d'aide sur les regexp
    Par Uld dans le forum Langage
    Réponses: 1
    Dernier message: 18/08/2006, 22h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo