Passage de void à String en Java [Résolu/Fermé]

Signaler
Messages postés
16
Date d'inscription
jeudi 23 août 2012
Statut
Membre
Dernière intervention
9 septembre 2012
-
Messages postés
16
Date d'inscription
jeudi 23 août 2012
Statut
Membre
Dernière intervention
9 septembre 2012
-
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

Messages postés
15987
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2020
2 651
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.
Messages postés
16
Date d'inscription
jeudi 23 août 2012
Statut
Membre
Dernière intervention
9 septembre 2012

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
Messages postés
15987
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2020
2 651
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...
Messages postés
16
Date d'inscription
jeudi 23 août 2012
Statut
Membre
Dernière intervention
9 septembre 2012

j'ai essayé , c la meme chose avec StringBuilder
Messages postés
15987
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 août 2020
2 651
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...
Messages postés
16
Date d'inscription
jeudi 23 août 2012
Statut
Membre
Dernière intervention
9 septembre 2012

c'est bon, en ayant modifié print() ça a marché, merci bcp tu m'as sauvé d'une depression :)