hi,
ich bearbeite grade eine Aufgabe und komm nicht weiter.
Diesen Test muss ich zum laufen bringen. Das heißt Test 1 -> Diesen Ausdruck 3*((((2+3)*2)-5)/5)) ->
so umwandeln 2,3,+,2,*,5,-,5,/,3,* (ich hoffe ic hhab mich nicht verguckt)
Test2 -> das ganze einfahc ausrechenn (3*((((2+3)*2)-5)/5)) = 3.
Ein großer Teil wurd mir schon vorgegeben. Ich hab im Kommentar die Teile Kommentiert was ich noch mal extra implementiert hab:
Jetzt hab ich ein paar Fragen. Auf meinem Blatt steht dass ich eine Methode
boolean equals(Object o) erstellen soll. Ok ich hab das jetzt getan. Ist die richtig? Und wieso brauch ich die, wann vergleich ich denn diese Objekte. Da feht mir der ansatz. Ich hab ja eine string den nich übergegen bekomme jetzt vergleich ich einfach die Zeichen dachte ich mir also Primitivedatentypen
if('+'==expr.charAt(pos)) dann ...
Vielleicht kann mir jemand auch noch paar gute Typs geben bin am verzweiflen. Wo ich ansetzten kann. Das ich das alles Rekursiv machen muss ist mir klar weill das ein Baum ist ... Und wegen Stack Last in Last out.
So eine kleine Anleitung von einem Profi wäre echt cool
liebe grüße
ich bearbeite grade eine Aufgabe und komm nicht weiter.
Java:
public class ExpressionsTest {
@Test
public void testShouldResultInEqualSyntaxTrees() {
Expression expr1 = new Mult(new Const(5), new Div(new Sub(new Mult(
new Add(new Const(2), new Const(3)), new Const(5)),
new Const(5)), new Const(5)));
Expression expr2 = Expressions.parse("(3*((((2+3)*2)-5)/5))");
assertTrue(expr1.equals(expr2));
}
@Test
public void testShouldResultInCorrectEvaluation() {
Expression expr = Expressions.parse("(3*((((2+3)*2)-5)/5))");
assertEquals(3, expr.evaluate());
}
}
so umwandeln 2,3,+,2,*,5,-,5,/,3,* (ich hoffe ic hhab mich nicht verguckt)
Test2 -> das ganze einfahc ausrechenn (3*((((2+3)*2)-5)/5)) = 3.
Ein großer Teil wurd mir schon vorgegeben. Ich hab im Kommentar die Teile Kommentiert was ich noch mal extra implementiert hab:
Java:
public class Expressions {
private Expressions() {
}
public interface Expression {
int evaluate();
}
public static abstract class ComplexExpression implements Expression {
private Expression x;
private Expression y;
public String toString() {
return null;
}
public ComplexExpression(Expression x, Expression y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (o == this)
return true;
if (!o.getClass().equals(getClass()))
return false;
ComplexExpression that = (ComplexExpression) o;
return this.x.equals(that.x) && this.y.equals(that.y);
// HashCode
}
protected Expression getx() {
return x;
}
protected Expression gety() {
return y;
}
}
public static class Const implements Expression {
private int y;
public Const(int y) {
this.y = y;
}
@Override
public String toString() { // verändert
return y + "";
}
@Override
public int evaluate() {
return y;
}
}
public static class Add extends ComplexExpression {
public Add(Expression x, Expression y) {
super(x, y);
}
@Override
public String toString() {//verändert
return "+";
}
@Override
public int evaluate() {
return getx().evaluate() + gety().evaluate();
}
}
// ... Mult,Sub,Div sehen wie Add aus hab ich mal weggelassen um Platz zu sparren
private static class ToPostfix {
private int pos = 0;
private Stack<Expression> result = new Stack<>();//verändert war eine Liste
public ToPostfix(String expression) {
parse(expression);
}
public Stack<Expression> get() {//verändert war eine Liste
return result;
}
// hab ich komplett verändert
private Expression parse(String expr) {//verändert
if (istZiffer(expr.charAt(pos))) {
result.push(new Const(expr.charAt(pos) - '0'));// '1'-'0'=49-48=1.
++pos;
// zB. (2+2)
} else if (expr.charAt(pos) == '(') {
char op;
++pos;
Const tempZ1 = new Const(expr.charAt(pos) - '0');
parse(expr);
op = expr.charAt(pos);
++pos;
parse(expr);// rekusion ziffer zuerst 2,6
Const tempZ2 = new Const(expr.charAt(pos) - '0');
if (op == '*') {
result.push(new Mult(tempZ1, tempZ2));
} else if (op == '+') {
result.push(new Add(tempZ1, tempZ2));
} else if (op == '/') {
result.push(new Div(tempZ1, tempZ2));
} else {
result.push(new Sub(tempZ1, tempZ2));
}
++pos;
}
return null;
}
private static boolean istZiffer(char c) {
return (c >= '0' && c <= '9');
}
}
// Liefert eine Postfix Darstellung des Ausdrucks
public static List<Expression> toPostfix(String expression) {
return new ToPostfix(expression).get();
}
Jetzt hab ich ein paar Fragen. Auf meinem Blatt steht dass ich eine Methode
boolean equals(Object o) erstellen soll. Ok ich hab das jetzt getan. Ist die richtig? Und wieso brauch ich die, wann vergleich ich denn diese Objekte. Da feht mir der ansatz. Ich hab ja eine string den nich übergegen bekomme jetzt vergleich ich einfach die Zeichen dachte ich mir also Primitivedatentypen
if('+'==expr.charAt(pos)) dann ...
Vielleicht kann mir jemand auch noch paar gute Typs geben bin am verzweiflen. Wo ich ansetzten kann. Das ich das alles Rekursiv machen muss ist mir klar weill das ein Baum ist ... Und wegen Stack Last in Last out.
So eine kleine Anleitung von einem Profi wäre echt cool
liebe grüße