Passage de void à String en Java

Résolu/Fermé
Moon Yagami Messages postés 16 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 9 septembre 2012 - 24 août 2012 à 13:32
Moon Yagami Messages postés 16 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 9 septembre 2012 - 24 août 2012 à 16:05
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

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 août 2012 à 14:50
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
Moon Yagami Messages postés 16 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 9 septembre 2012
24 août 2012 à 15:03
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
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 août 2012 à 15:29
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
Moon Yagami Messages postés 16 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 9 septembre 2012
24 août 2012 à 15:54
j'ai essayé , c la meme chose avec StringBuilder
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 août 2012 à 15:58
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
Moon Yagami Messages postés 16 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 9 septembre 2012
24 août 2012 à 16:05
c'est bon, en ayant modifié print() ça a marché, merci bcp tu m'as sauvé d'une depression :)
0