Swisslinux.org

− Le carrefour GNU/Linux en Suisse −

 

Langue

 

Le Forum

Vous n'êtes pas identifié.

#1 23 Feb 2006 14:42:12

Premium
Citoyen(ne)
 
Date d'inscription: 10 Feb 2006
Messages: 11

[JAVA]Problème de compréhension

Bonjour,


J'ai un probème de compréhension de l'énoncé qui me demandait de faire cet exo.

On me dit que la classe Tree à telle méthode et on me demande d'utiliser @Override pour réécrire les méthodes size(),toString() dans Tree ,or on ne peut pas utiliser 2 méthodes d'une même classe ayant la même signature,profil,...

Je voudrais savoir si quelqu'un avait une idée de ce qui doit être fait car je bloque.

Merci

Voici l'énoncé et ce que j'ai fait

Une classe Tree implémente des arbres dont les noeuds (noeuds internes ou feuilles) contiennent une donnée de nom data (un int) et ont un nombre quelconque de fils.Pour éviter de stocker une liste de fils dans les noeuds sans fils (les feuilles),on utilise 2 classes Leaf et InternalNode.
La classe Leaf représente les noeuds sans fils ayant un ou plusieurs fils .Dans les noeuds internes ,les fils sont représentés par un champ children de type List<Node>. 
La classe Tree comprend 

Code:

public class Tree {  
 private final Node root;  
 public String toString() { return root.toString();}  
 public int size() { return root.size();}  
 public boolean contains(int i) { return root.contains(i);}  
 ...........  
}  

1)Expliquer brièvement pourquoi on a besoin d'un super-type Node

2)Doit-on utiliser une interface ou une classe abstraite pour représenter le super-type Node?Justifier votre choix.

3)Expliquer pourquoi il faut un constructeur dans la classe Tree qui prend en ragument la racine de l'arbre.Écrire le code correspondant.

4)Indiquer l'ensemble des modificateurs de visibilité possibles pour la méthode size() de Node.

5)Écrire les autres classes (déclarations ,champs et constructeurs).Attention aux modificateurs de visibilité.Par exemple le code suivant

Code:

List<Node> listThree = new ArrayList<Node>();  
listThree.add(new Leaf(5));  
listThree.add(new Leaf(6));  
List<Node> listOne = new LinkedList<Node>();  
listOne.add(new InternalNode(3,listThree));  
listOne.add(new Leaf(4));  
Node one = new InternalNode(1,listOne);  
Tree tree = new Tree(one);  

crée l'arbre ci-dessous(l'arbre est comme cela: 
l'arbre a pour racine 1 qui a trois fils 2,3,4(de gauche a droite), 3 a deux fils 5 et 6 ) 

6)Écrire une méthode size() dans la classe Tree.La taille d'un arbre est son nombre de noeuds.
Indiquer le code des méthodes à ajouter dans les autres classes.Utiliser l'annotation @Override.

<...>

j'ai écrit l'interface et les différentes classes que l'on me demandait de faire dans un exercice.

Code:

interface Node{
    String toString(); 
    int size();
    /*boolean contains(int i);*/
}

Code:

public class Leaf implements Node{
    private int data;
    
    public Leaf(int data){
    this.data = data;
    }
    
    public String toString(){
    return (new Integer(data)).toString();
    }
    
    public int size(){
    return 1;
    }
    
    public boolean contains(int i){
    return data == i;
    }
}

Code:

import java.util.*;

public class InternalNode implements Node{
    private int data;
    private List<Node> childrens;
    
    public InternalNode(int data, List<Node> childrens){
    this.data = data;
    this.childrens = childrens;
    }
    
    public String toString(){
    StringBuilder sb = new StringBuilder();
    sb.append(data);
    sb.append(childrens.toString());
    return sb.toString();
    }
    
    public int size(){
    return 1 + childrens.size();
    }
}

Code:

import java.util.*;

public class Tree{
    private final Node root;
    
    public Tree(Node root){
    this.root = root;
    }
    
    public String toString() { 
    return root.toString();
    } 
    
    public int size() { 
    return root.size();
    }
    
    /*public boolean contains(int i) { 
      return root.contains(i);
      }*/
    
    public static void main(String [] args){
    
    List<Node> listThree = new ArrayList<Node>(); 
    listThree.add(new Leaf(5)); 
    listThree.add(new Leaf(6)); 
    
    List<Node> listOne = new LinkedList<Node>(); 
    listOne.add(new InternalNode(3,listThree)); 
    listOne.add(new Leaf(4)); 
    
    Node one = new InternalNode(1,listOne); 
    
    Tree tree = new Tree(one); 
    
    System.out.println(tree);
    }
}

Hors ligne

 

#2 23 Feb 2006 14:55:30

jean@adimp.ch
Illuminé(e)
Lieu: Marly
Date d'inscription: 10 Mar 2005
Messages: 1228
Site web

Re: [JAVA]Problème de compréhension

Salut,
Je penses que tu devrais poser la question ici: http://forum.java.sun.com
Tu peux peut-être surcharger les méthodes en clonant ou en interfaçant l'objet. Moi j'ai plus ces problèmes, en python on a le multihéritage d'office. Vive ZOPE.
A+. :cheesy:


--------------------------------------------------------
Jean Tinguely Awais
Ma vie sur twitter : http://www.twitter.com/tservi

Hors ligne

 

#3 23 Feb 2006 17:19:28

BOFH
Admin
Lieu: Ecublens, VD
Date d'inscription: 03 Feb 2005
Messages: 862
Site web

Re: [JAVA]Problème de compréhension

Hello,

  Je ne ferai pas de commentaires sur la pratique qui consiste a demander a des inconnus de résoudre des exercices...

Code:

   public int size(){
   return 1 + childrens.size();
   }

Ca c'est faux, si size() est sensé compter le nombre total de fils. Il faut itérer sur les éléments de childrens et prendre la somme, au lieu d'appeler size() sur childrens, qui donne uniquement le nombre de fils au premier degré.

Ensuite, je ne vois pas ou est le problème. Aucune de tes classes n'a de superclasse, donc il n'y a que toString() qui fait intervenir l'overriding. Et AFAK, @Override est une directive javadoc qui n'affecte pas le code produit.

Hors ligne

 

Pied de page des forums

Powered by FluxBB