Passage de void à String en Java

Résolu
Moon Yagami Messages postés 17 Statut Membre -  
Moon Yagami Messages postés 17 Statut Membre -
Bonjour,

La tache à l'air facile comme ça, mais ayant transformé une fonction d'affichage de void en String(en modifiant System.out.print par une chaine qui reçoit le texte à afficher), le résultat n'est pas le meme! pourriez-vous m'aider à comprendre mon erreur?
FONCTION VOID
public void printItemsets(int nbObject) {

System.out.println (" ------- " + name + " -------");
int patternCount = 0;
int levelCount = 0;
for (List<ItemsetApriori> level : levels) {

System.out.println(" L" + levelCount );
for (ItemsetApriori itemset : level) {

System.out.print( " pattern " + patternCount + ": ");
itemset.print();

System.out.print( "support : "
+ itemset.getSupportRelatifFormatted(nbObject));
patternCount++;
String closed = itemset.isClose() ? "closed" : "";

System.out.println( " (" + itemset.getAbsoluteSupport() + "/"
+ nbObject + ") " + closed);
if (itemset.isPseudoclose()) {

System.out.println("pseudo-closed, closure: ");
itemset.getClosure().print();

System.out.print(" ("
+ itemset.getClosure().getAbsoluteSupport() + "/"
+ nbObject + ")");
}

System.out.print("");
}
levelCount++;
}

System.out.println(" --------------------------------");

}
RESULTAT AFFICHE :
------- FREQUENT ITEMSETS -------
L0
pattern 0: support : 1 (8/8)
L1
pattern 1: 1 support : 0,75 (6/8)
pattern 2: 2 support : 0,62 (5/8)
pattern 3: 3 support : 0,5 (4/8)
pattern 4: 4 support : 0,62 (5/8)
pattern 5: 5 support : 0,62 (5/8)
L2
pattern 6: 1 5 support : 0,5 (4/8)
--------------------------------

FONCTION STRING
public String printItemsets(int nbObject) {
String retour= "";

retour+= " ------- " + name + " -------\n";
int patternCount = 0;
int levelCount = 0;
for (List<ItemsetApriori> level : levels) {

retour+= " L" + levelCount + " \n";
for (ItemsetApriori itemset : level) {

retour+= " pattern " + patternCount + ": ";
itemset.print();

retour+= "support : "
+ itemset.getSupportRelatifFormatted(nbObject);
patternCount++;
String closed = itemset.isClose() ? "closed" : "";

retour+= " (" + itemset.getAbsoluteSupport() + "/"
+ nbObject + ") " + closed+ "\n";
if (itemset.isPseudoclose()) {

retour+= "pseudo-closed, closure: \n";
itemset.getClosure().print();

retour+= " ("
+ itemset.getClosure().getAbsoluteSupport() + "/"
+ nbObject + ")";
}

retour+= "";
}
levelCount++;
}

retour+= " --------------------------------\n";
return retour ;

}
AFFICHAGE:
------- FREQUENT ITEMSETS -------
L0
pattern 0: support : 1 (8/8)
L1
pattern 1: support : 0,75 (6/8)
pattern 2: support : 0,62 (5/8)
pattern 3: support : 0,62 (5/8)
pattern 4: support : 0,62 (5/8)
--------------------------------
Après pattern 1, il devrait y avoir : 1, Itemset.print() n'affiche que dans la console et qu'une seule fois !
J'ai beau voir et revoir ce code je ne comprends pas! j'utilise Netbeans 7.1.2 merci d avance :)

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    1) Tu ne peux pas avoir deux méthodes de même nom avec les même arguments
    2) Lorsque l'on utilise beaucoup de concaténations de String, on utilise un StringBuilder
    3) nbObject est certainement être un paramètre inutile, tu dois pouvoir le calculer, ta méthode qui renvoie un String serait alors toString()
    4) On ne fait jamais des méthodes "print", ça ne sert à rien !

    @Deprecated
    public void printItemsets()
    {
        System.out.print(this);
    }
    
    @Override
    public String toString()
    {
        int nbObject = getNbObject();
        
        int patternCount = 0;
        int levelCount = 0;
        
        StringBuilder sb = new StringBuilder("-------- ").append(name).append(" --------");
        
        int n=sb.length();
        
        sb.append(endl);
        
        for (List<ItemsetApriori> level : levels)
        {
            sb.append("L").append(levelCount).append(endl);
            
            for (ItemsetApriori itemset : level)
            {
                sb.append("pattern ").append(patternCount++).append(": ").append(itemset.toString())
                    .append(" support: ").append(itemset.getSupportRelatifFormatted(nbObject))
                    .append(" (");
                
                if (itemset.isClose())
                    sb.append("closed");
                else
                    sb.append(itemset.getAbsoluteSupport()).append("/").append(nbObject);
                
                sb.append(")").append(endl);
                
                if (itemset.isPseudoclose())
                {
                    sb.append("pseudo-closed, closure: ").append(itemset.getClosure().toString())
                        .append(" (").append(itemset.getClosure().getAbsoluteSupport()).append("/")
                        .append(nbObject).append(")").append(endl);
                }
            }
        
            levelCount++;
        }
        
        for (int i=0; i<n; i++)
            sb.append('-');
        sb.append(endl);
        
        return sb.toString();
    }

    Remarque : j'ai mis toString() là où il y avait print(), il ne faudra pas oublier d'adapter le code en conséquence.
    0
    1. Moon Yagami Messages postés 17 Statut Membre
       
      merci, mais il ne s'agit pas de 2 méthodes avec les memes nom et parametres, j'ai remplacé l'une par l'autre ;) merci pr le StringBuilder jvais voir
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      C'est parce que je me suis basé sur la deuxième méthode pour faire cette troisième, sachant que de toute façon je n'ai pas pu tester puisqu'il me manque le code des autres classes, et en particulier à la méthode "print" que tu utilises dans ItemsetApriori, et qui est à mon avis cause de l'erreur...
      0
    3. Moon Yagami Messages postés 17 Statut Membre
       
      j'ai essayé , c la meme chose avec StringBuilder
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      Explique mieux ce que c'est ta question alors, parce que pour passer "de void" (tout avec println) en String, c'est bien comme ça que tu dois faire, mais en t'assurant qu'il n'y ai plus de println nul part, et en particulier remplacer la méthode print de ItemsetApriori par une méthode qui renvoie un String...
      0
    5. Moon Yagami Messages postés 17 Statut Membre
       
      c'est bon, en ayant modifié print() ça a marché, merci bcp tu m'as sauvé d'une depression :)
      0