Composite Pattern für Ausgabe von Ausdruck

  • Themenstarter Themenstarter Incubus
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
I

Incubus

Gast
Hilfeeeeee! :bahnhof:

Ich habe folgendes Problem:

Ich soll mit Hilfe des Composite Patterns einen Ausdruck richtig ausgeben.

Ausdruck --> (((a+b)*(a-c))+((b*d)-a)) --> Die Klammern werden in der Ausgabefunktion hard gecoded

Bisher habe ich folgenden Code welcher aber noch nicht wirklich richtig funktioniert:


Code:
interface Component {
   public String defaultMethod();
   public ArrayList<Component> getChildren();
   public boolean addComponent(Component c);
   public boolean removeComponent(Component c);
}

class Composite implements Component {
   private String id;
   private ArrayList<Component> components = new ArrayList<Component>();

   public Composite(String identification)         { id = identification; }

   [b]public String defaultMethod() { 
       String s =  id ; 
       for (Component child : getChildren())
           s = s +   child.defaultMethod();
       return s ;[/b]
   }

   public ArrayList<Component> getChildren()       { return components; }
   public boolean addComponent(Component c)        { return components.add(c); }
   public boolean removeComponent(Component c)     { return components.remove(c); }
}
   
class Leaf implements Component {
   private String id;

   public Leaf(String identification)              { id = identification; }

   public String defaultMethod()                   { return id; }
   public ArrayList<Component> getChildren()       { return null; }
   public boolean addComponent(Component c)        { return false; }
   public boolean removeComponent(Component c)     { return false; }
}

class CompositePattern {
   public static void main(String[] args) {
       Composite Plus = new Composite("+");
       Composite Plus1 = new Composite("+");
       Composite Mal = new Composite("*");
       Leaf a = new Leaf("a");
       Leaf b = new Leaf("b");
       Leaf c = new Leaf("c");
       Leaf d = new Leaf("d");
       Plus.addComponent(Plus1);
       Plus.addComponent(Mal);
       Plus1.addComponent(a);
       Plus1.addComponent(b);
       Mal.addComponent(c);
       Mal.addComponent(d);
       
        
       System.out.println( Plus.defaultMethod() );
  
   }
}

Die Ausgabe bei diesem Test lautet jetzt aber "+ +ab *cd" und nicht wie gewünscht a+b + c*d

Der Binärbaum wird leider Falsch abgearbeitet... :autsch:

Kann mir bitte einer helfen???

Thnx im Vorraus
 
ja schau dir deine Ausgabe-Operation doch mal an?
was macht die?
erst das eigene Zeichen und dann alle Kinder,

für a + b also

erst das +, dann a, dann b
-> "+ab"

und jetzt willst du wissen was du umstellen musst, damit "a+b" rauskommt?
versuche doch mal selber die Reihenfolge ein wenig umzustellen, viele Möglichkeiten gibts da ja eh nicht
 
Ja, die Ausgabeoperation stimmt nicht. Nur irgendwie bekomme ich sie einfach nicht hin. Ich blicke da gerade nicht durch...

Wenn ich das ganze so mache:
Code:
for (Component child : getChildren()){
           s = s  +  child.defaultMethod();
           s= s +this.id;
       }
bekomme ich --> a-b-+c*d*+

Da habe ich aber immernoch en Minus und en Mal zuviel.
Habe schon versucht mit ner abfrage isLeaf() return boolean das ganze zu handeln. habe es aber nicht hinbekommen :-(
 
was soll denn das? denke doch mal nach, schreibe dir das per Hand auf,
BENUTZE EINFACHE BEISPIELE,

dein Code ist also
'für jedes Kind: zeige Kind und zeige Operation'

wie sieht das bei a + b aus?
erstes Kind a: also a+
dann noch ein Kind b: also b+ hinten dran
zusammen a+b+

offensichtlich falsch,

du hast drei Elemente: ein Kind, eine Operation und ein zweites Kind,

da schaffst du keine Ausgabe
"erstes Kind - Operation - zweites Kind"?
was ist daran so schwer?

bisher hast du schon
"Operation - erstes Kind - zweites Kind"
und
"erstes Kind - Operation - zweites Kind - Operation" geschafft,

nun weiter probieren bis
"erstes Kind - Operation - zweites Kind"?
rauskommt 😉
Tipp: versuche keine Schleifen, sondern drei simple Befehle hintereinander

--------

um Leaf musst du dich nicht kümmern, Leaf ist eine eigene Klasse, da ist die Operation schon fertig
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben