Modification par référence

Modification par référence - Java - Programmation

Marsh Posté le 03-01-2015 à 23:37:07    

Bonjour, j'aimerai modifier la valeur même d'une variable simplement par sa référence :

Code :
  1. public class Objet1{}
  2. public class Objet2{}
  3. public void main(){
  4.     Objet1 obj1;
  5.     Objet2 obj2 = null;
  6.    
  7.     obj1 = fonction(obj2);
  8.     // obj2 == null ici
  9. }
  10. public Objet1 fonction(Objet2 obj2){
  11.     obj2 = new Objet2();
  12.     return new Objet1();
  13. }


On ne connait la valeur des deux objets que dans la fonction. Le problème vient du fait que les deux objets doivent être retournés alors qu'ils sont de type différents
 
en C on ferait simplement avec un pointeur :

Code :
  1. void main(){
  2.     int obj1;
  3.     char obj2;
  4.     obj1 = fonction(&obj2);
  5.     // obj1 == 1, obj2 == 'a'  
  6. }
  7. int fonction(char *obj2){
  8.     *obj2 = 'a'
  9.     return 1;
  10. }


Ma question est : Comment faire ce genre de manipulation en Java ? sans passer par une autre classe "Couple<Objet1, Objet2>" ou un truc du genre si vous préférez.
Merci d'avance  :)


Message édité par didibear le 04-01-2015 à 00:04:27
Reply

Marsh Posté le 03-01-2015 à 23:37:07   

Reply

Marsh Posté le 04-01-2015 à 10:39:07    

Bonjour,
 
Humm je dirais simplement que comme tout est une classe en java, tu peux déclarer en private static tes deux variables Objet1 & Objet2.
 
Tu aura ainsi accès à tes variables dans ta méthode ligne 13.
 
Je suis pas sur que c'est ce que tu gère mais java étant un langage fortement objet c'est ce qui parait le plus logique.


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 04-01-2015 à 19:04:14    

Oui je suis d'accord dans ce cas là puisque les deux objets au même niveau.
Je recherche simplement un moyen de retourné deux valeurs de type différent dans une même fonction.
 
Je vais expliquer mon réel problème :
Je possède une 3 classes : Bibliotheque, Etagere et Livre
Les Bibliotheques contiennent des Etageres qui contiennent des Livres.
 
Dans Bibliotheque je veux une méthode getLivre qui me renvoi le livre, ainsi que l'étagère dans laquelle il se trouve  
Cela donne :  

Code :
  1. public class Bibliotheque {
  2.     private List<Etagere> etageres;
  3.     public Bibliotheque (){
  4.          etageres = new ArrayList<>();
  5.     }
  6.     public Livre getLivre(int num){
  7.          // Je veux recuperer le livre et l'etagere ou est le livre
  8.         for(Etagere etage : etageres)
  9.             for(Livre livre : etage.livres) // oui sa liste est public voyons :D
  10.                 if (livre.getNum == num)
  11.                     return livre; // Je veux aussi renvoyer etage
  12.     }
  13. }
  14. public class Etagere{
  15.     private List<Livre> livres;
  16.     public Etagere (){
  17.          livres= new ArrayList<>();
  18.     }
  19. }
  20. public class Livre{
  21.     private int num;
  22.     public Livre (int n){
  23.         num = n;
  24.     }
  25.     public int getNum(){
  26.         return num;
  27.     }
  28. }


Voila, comment récupérer le Livre et l'Etagere à la fois dans getLivre ?
Je veux éviter le surplus de code inutile tel que de reparcourir les listes pour un résultat qu'on a déjà.
C'est pour cela que j'ai penser à la modification par référence en C, qui me parait très simple et peu coûteux.
Voir même au tuple en Python, mais cela reviendrait à créer une nouvelle classe Couple<Livre, Etagere> que je n'apprécie guerre.

Code :
  1. /* Par référence : */
  2. public Livre getLivre(int num, Etagere *etage){...} // N'existe pas en Java
  3. /* Tuple : */
  4. public (Livre, Etagere) getLivre(int num){...} // N'existe pas en Java (mdr)



Message édité par didibear le 04-01-2015 à 19:48:50
Reply

Marsh Posté le 05-01-2015 à 08:26:00    

Re,
 
La on est plus dans un problème de conception que de code ^^
Alors personnellement je ferais comme ça :
 
Dans ta classe bibliothèque tu as juste une liste d'étagère car une étagère est forcement dans une bibliothèque
 
Ta classe Etagère doit avoir un nombre, ( 1,2,3,4 étagère )
Et une liste de livre car tu range ton livre dans une étagère.
(Regarde tu coté des hasmap, c'est une arrayList a deux dimension pour parler simplement )
C'est donc dans cette classe que tu aura getLivre();
 
Ensuite ta classe livre auras juste les propriété d'un livre ( titre, auteur toussa )
 
Ainsi si tu stocke un objet étagère dans une la liste d'étagère d'une bibliothèque,
 
tu sera en mesure de retrouver ce que tu cherche.
 
PS : cette méthodes fonctionnera mais n'es pas la plus propre, il faut chercher au niveau de l'héritage qui te permettra de faire une code plus propre et plus facilement réutilisable


---------------
Made you your own sentence without believing that of the others...
Reply

Marsh Posté le 07-01-2015 à 23:25:07    

Et bien la seul différence a ce code serait la méthode getLivre() qui serai dans Etagere et une Map dans l'étagere, j'ai de bonne notion en java, je connais HashMap tout ca.
 
je voudrais juste pouvoir faire dans le main du code suivant :
 

Code :
  1. public class Bibliotheque {
  2.     private List<Etagere> etageres;
  3.     public Bibliotheque (){
  4.          etageres = new ArrayList<>();
  5.     }
  6.    
  7.     public Livre getLivre(int num){
  8.          Livre livre;
  9.          for(Etagere etage : etageres)
  10.              if(( livre = etage.getLivre(num) ) != null)
  11.                  return livre;
  12.          return null;
  13.     }
  14.     public Etagere getEtagere(int num){
  15.          for(Etagere etage : etageres)
  16.              if(( etage.getLivre(num) ) != null)
  17.                  return etage;
  18.          return null;
  19.     }
  20. }
  21. public class Etagere implements Iterable<Etagere> {
  22.     private List<Livre> livres;
  23.     public Etagere (){
  24.          livres= new ArrayList<>();
  25.     }
  26.     public Livre getLivre(int num){
  27.         for(Livre livre : livres)
  28.             if (livre.getNum == num)
  29.                 return livre;   
  30.         return null;
  31.     }
  32.     @Override
  33.     public Iterator<Livre> iterator(){
  34.         return livres.iterator();
  35.     }
  36. }
  37. public class Livre{
  38.     private int num;
  39.     public Livre (int n){
  40.         num = n;
  41.     }
  42.     public int getNum(){
  43.         return num;
  44.     }
  45. }
  46. public static void main (String [] args){
  47.    
  48.     Bibliotheque b = new Bibliotheque();
  49.     // ajout des livre dans les etageres dans b
  50.     Systeme.out.println( b.getLivre(1) + " dans l'etagere " + b.getEtagere(1) );
  51.     // ou plutot, en mieux
  52.     Etagere etage = b.getEtagere(1);
  53.     Systeme.out.println( etage.getLivre(1) + " dans l'etagere " + etage );
  54. }


Sauf que là on refait un parcourt inutile de toute la bibliothèque (ou de étagère seulement).
Ça me parait pourtant tellement simple à résoudre avec une solution adéquat.
Juste fusionner getLivre et getEtagere de Bibliotheque x)


Message édité par didibear le 07-01-2015 à 23:25:42
Reply

Marsh Posté le 12-03-2015 à 14:53:15    

Dans Etagere, stocke une HashMap<Integer,Livre> (ou une LinkedHashMap si l'ordre des livres est important)

 

Et quand tu veux savoir si un livre est dans une étagère donnée, tu fais

Code :
  1. for (Etagere currentEtagere : etageres) {
  2.   if (mapLivres.containsKey(num)) {
  3.     return etagereCourante;
  4.   }
  5. }
  6. throw new NoSuchElementException("J'ai pas trouvé ton putain de livre " + num + " de merde !" );


Message édité par Fraisouille le 12-03-2015 à 14:54:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed