Java - Material

Hier finden sich zusätzliche Java Programme ohne weiteren Kommentar.

Beispiel:

public class Node {
}

Beispiel:

public class Oper extends Node {

    final String text;
    protected int art = -1;

    public Oper(String text) {
        this.text = text.trim();
        if ( this.text == "*" ) {
            art = 1;
        }
        if ( this.text == "+" ) {
            art = 2;
        }
        if ( this.text == "-" ) {
            art = 3;
        }
    }

    public String toString() {
        return "oper[" + text + "," + art + "]";
    }
}

Beispiel:

public class Leaf extends Node {

    final String text;

    public Leaf(String text) {
        this.text = text;
    }

    public String toString() {
        return "leaf[" + text + "]";
    }
}

Beispiel:

public class Expr extends Node {

    final Node left;
    final Oper oper;
    final Node right;

    public Expr() {
        this.left = null;
        this.oper = null;
        this.right = null;
    }

    public Expr(Node left, Oper oper, Node right) {
        this.left = left;
        this.oper = oper;
        this.right = right;
    }

    public String toString() {
        return "expr[" + left + " " + oper + " " + right + "]";
    }
}

Beispiel:

public class Ausdruck {

    Klammern k = new Klammern();

    public Expr expression(String[] parts) {
        Node left = new Leaf(parts[0]);
        Oper oper = new Oper(parts[1]);
        Node right = new Leaf(parts[2]);
        return new Expr(left,oper,right);
    }

    public Expr extract(String text) {
        if ( text == null || text.length() == 0 ) {
            System.out.println("no text");
            return new Expr();
        }
        int i = text.indexOf("(");
        if ( i < 0 ) {
            String[] parts = k.operator( text );
            k.print( parts );
            return expression(parts);
        }
        String links = text.substring(0,i).trim();
        String[] parts = null;
        if ( links.length() > 0 ) {
           parts = k.operator( links );
           k.print( parts );
        }
        text = text.substring(i).trim();
        int level = 1;
        for ( i = 1 ; i < text.length(); i++ ) {
            char c = text.charAt(i);
            if ( c == '(' ) {
                level++;
            }
            if ( c == ')' ) {
                level--;
            }
            if ( level == 0 ) {
                break;
            }
        }
        String innen = text.substring(1,i).trim();
        Expr inexpr = extract(innen);
        Expr rexpr = null;
        if ( i+1 < text.length() ) {
           String rest = text.substring(i+1).trim();
           rexpr = extract(rest);
        }
        Expr result = null;
        if ( parts != null ) {
           Node left = new Leaf(parts[0]);
           Oper oper = new Oper(parts[1]);
           // parts[2] == "";
           result = new Expr(left,oper,inexpr);
        } else {
           result = inexpr;
        }
        if ( rexpr != null ) { // rexpr.left == ""
            result = new Expr(result,rexpr.oper,rexpr.right);
        }
        return result;
    }

    public int evaluate(Node n) {
        if ( n == null ) {
            return 0;
        }
        int r = 0;
        if ( n instanceof Oper ) {
            System.out.println("oper nur alleine = " + n);
            return r;
        }
        if ( n instanceof Leaf ) {
            try {
                Leaf l = (Leaf)n;
                r = Integer.parseInt( l.text );
            } catch( NumberFormatException e ) {
                System.out.println("keine Zahl = " + n);
            }
            return r;
        }
        if ( n instanceof Expr ) {
            Expr e = (Expr)n;
            int el = evaluate(e.left);
            int er = evaluate(e.right);
            switch ( e.oper.art ) {
            case 1: r = el * er;
                break;
            case 2: r = el + er;
                break;
            case 3: r = el - er;
                break;
            default: 
            }
            return r;
        }
        System.out.println("unbekannter Ausdruck = " + n);
        return r;
    }

    public static void main(String[] args) {
        Ausdruck k = new Ausdruck();
        String s = "(3-4)*(7+2)";
        Expr r;
        r = k.extract("2*3");
        System.out.println("r = " + r);
        System.out.println("eval(r) = " + k.evaluate(r));
        r = k.extract("2*(1+3)+5");
        System.out.println("r = " + r);
        System.out.println("eval(r) = " + k.evaluate(r));
        r = k.extract("(3-4)*(7+2)");
        System.out.println("r = " + r);
        System.out.println("eval(r) = " + k.evaluate(r));
        r = k.extract("(4*(7+2))+5");
        System.out.println("r = " + r);
        System.out.println("eval(r) = " + k.evaluate(r));
        r = k.extract("(4*(7+2))+(5-(8*6))");
        System.out.println("r = " + r);
        System.out.println("eval(r) = " + k.evaluate(r));
        r = k.extract("2*(3*4)");
        System.out.println("r = " + r);
        System.out.println("eval(r) = " + k.evaluate(r));
    }
}

Heinz Kredel
Last modified: Sun Nov 30 13:42:07 CET 2008