Toon posts:

[JAVA] Script naar Boolean

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben nog een beginner met Java, dus sorry als dit een stomme vraag is.

Ik ben bezig met een programmatje schrijven dat voor een logische rij in disjunctieve normaalvorm de boolese waarde er van uitrekent.
in mijn programma zet ik de rij eerst om naar een string met de juiste logische operatoren, en wil deze daarna door java een waarheidswaarde laten toekennen.

dit laatste wil die echter niet doen.

als ik dit bijvoorbeeld invul:
String valuatie2 = "(true && true) || (!true && !true) || (!true && true)";
System.out.println(valuatie2);

resulteert dit in: (true && true) || (!true && !true) || (!true && true)

terwijl als ik het zo invul
System.out.println((true && true) || (!true && !true) || (!true && true));

dit resulteert in: true

enig idee hoe ik dit kan oplossen?


hieronder mijn programma:



public class Sat {
public static void main(String [] args) {
System.out.println();

// hier voeren we de rij in en de valuatie in
int rij[][] = {{1,2},{-1,-2},{-1,2}};
boolean valuatie [] = {true, true};


String valuatie2 = "";
for(int i=0; i < rij.length; i++) {
valuatie2 = (valuatie2 + "(" );
for(int j=0; j < rij[i].length; j++) {
if(rij[i][j] < 0) {
valuatie2 = valuatie2 + "!" + valuatie[j];
}
else {
valuatie2 = valuatie2 + valuatie[j];
}
if(j < (rij[i].length - 1)) valuatie2 = valuatie2 + " && ";
}
valuatie2 = valuatie2 + ")";
if(i < (rij.length - 1)) valuatie2 = valuatie2 + " || ";
}
System.out.println(valuatie2);
}
}

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Dit is een String
code:
1
"(true && true) || (!true && !true) || (!true && true)"


En dit is een expressie, die door de compiler wordt geëvalueerd.
code:
1
((true && true) || (!true && !true) || (!true && true))


Als je van een String een expressie wilt maken, dan moet je 'm laten evalueren. Dit zou kunnen op dezelfde manier zoals je een programma schrijft: programmacode in een bestandje opslaan, compileren, uitvoeren.

Je kunt ook een programma schrijven die Strings parsed, en evalueert. Voor Java zijn er diverse mogelijkheden, bijvoorbeeld ANTLR.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Ik begrijp dat je maar één van de opties noemt, maar om dan meteen een library zoals Antlr te noemen lijkt me niet zo handig bij iemand die aangeeft een beginner te zijn.

Als je Java 1.6 gebruikt ("java -version" op de command line), kun je ook gebruikmaken van de scripting support:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class ScriptTest {
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine scriptEngine = manager.getEngineByName("JavaScript");
        Boolean b = (Boolean) scriptEngine.eval("((true && true) || (!true && !true) || (!true && true))");
        System.out.println(b);
    }
}


In bovenstaande code sample evalueer ik een JavaScript string.

Standaard levert Java een JavaScript engine mee (Rhino), dus dit werkt out of the box.

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan natuurlijk ook een simpele parser schrijven. Als je alleen simpele expressie wilt parsen met haakjes/true/false/boolean operators is dat nog niet zo complex.

Al is JKVA's oplossing natuurlijk wel erg makkelijk!

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je aanpak is sowieso verkeerd. Je moet helemaal geen string bouwen omdat vervolgens te evalueren. Je moet je input gewoon direct evalueren naar een boolean. Desnoods zou je gewoon een expressieboom kunnen maken die je vervolgens vrij simpel kunt evalueren (want dat is presies wat een parser doet - een stuk tekst omzetten in een expressieboom, nu ga jij er eerst tekst van maken zodat een parser dat weer om kan zetten terwijl je het net zo goed meteen zelf kan doen, een omweg dus)

(En java code zet je tussen [code=java]...[/code] tags ;))

[ Voor 42% gewijzigd door .oisyn op 01-12-2008 22:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.