2016-06-29 5 views
3

brauche ich so Booleschen Ausdrücken speichern:Gibt es eine Datenstruktur zum Speichern boolescher Ausdrücke?

x1 AND x2 AND x3 OR (x4 AND x5) AND (NOT x6) 

Jedes x Variable ist ein boolescher Ausdruck wie == oder != mit Werten. Das Problem besteht darin, verschachtelte AND und OR Klauseln (in sich selbst und/oder ineinander) zu speichern und sie mit NOT zu umhüllen. Die Wickeltiefe kann sehr tief sein.

Hat das Java SDK eine Datenstruktur für diese Ausdrücke?

+0

Es gibt keine solche Standarddatenstruktur. –

+0

Boolesche Ausdrücke sind schließlich mathematische Ausdrücke, und um mit ihnen richtig umzugehen, würde ich denken, dass Sie eine symbolische Manipulationsbibliothek benötigen würden, da Java (und die meisten Programmiersprachen) nur mit der numerischen Manipulation umgehen. Google schlägt vor: https://github.com/yuemingl/SymJava – chiliNUT

+0

Wie hast du das gemacht? –

Antwort

0

Sie können versuchen, jexl zu verwenden (http://commons.apache.org/jexl/)

JexlEngine jexl = new JexlEngine(); 
    jexl.setSilent(true); 
    jexl.setLenient(true); 

    Expression expression = jexl.createExpression("(a || b && (c && d))"); 
    JexlContext jexlContext = new MapContext(); 

    //b and c and d should pass 
    jexlContext.set("b",true); 
    jexlContext.set("c",true); 
    jexlContext.set("d",true); 

    assertTrue((Boolean)expression.evaluate(jexlContext)); 

    jexlContext = new MapContext(); 

    //b and c and NOT d should be false 
    jexlContext.set("b",true); 
    jexlContext.set("c",true); 

    //note this works without setting d to false on the context 
    //because null evaluates to false 

    assertFalse((Boolean)expression.evaluate(jexlContext)); 

Beispiel von this question

ps: Es ist nicht in Standard-sdk enthalten, aber ganz einfach zu bedienen.

0
abstract class Predicate {...} 
class AndPredicate extends Predicate { 
    private Predicate[] conjuncts; 
    ... 
} 
class OrPredicate extends Predicate { 
    private Predicate[] disjuncts; 
    ... 
} 
class NotPredicate extends Predicate { 
    Predicate negated; 
    ... 
} 

Was ist das Problem?

+0

Der Promlems ist - das Rad nicht neu zu erfinden und es zu unterstützen. Es gibt viele Datenstrukturen wie Maps, Listen, Sets und niemand für boolesche Ausdrücke? – Cherry

+0

Solche Datenstrukturen werden typischerweise in der Compiler-Technologie gefunden. Sie können nach einem Compiler suchen, der seine internen Datenstrukturen als öffentliche Bibliothek verfügbar macht. Viel Glück damit. –

1

In Java 8 ist die Funktionsschnittstelle Predicate<T> der richtige Weg.

Hier sind die Java docs.

Und hier sind verschiedene examples.

Also in Ihrem Anwendungsfall wird es etwas sein, wie folgt:

public static Predicate<Integer> equals(Integer compare) { 
    return i -> i.equals(compare); 
} 

public static Predicate<Integer> complex() { 
    return equals(1).and(equals(2)).and(equals(3)).or(equals(4).and(equals(5))).and(equals(6).negate()); 
} 

Denken Sie daran - nur Java 8 ab!

Verwandte Themen