如何组合判断逻辑

brooklyng60 2011-06-13 09:56:39
有个接口,例如
public interface R{
public boolean isOk(Form form);
}
根据实际情况我有很多种实现此接口的方式
T1,T2,T3每一个实现无非就是返回一个boolean结果,而且每个结果之间是可以进行逻辑运算符组合的
例如
T1.isOk()&&T2.isOk()||T3.isOk()得到一个最终的结果,每个逻辑运算符都是可以配置的
我现在要的是如何通过配置得得最终的结果
以上是3个实现,实际很有些。
...全文
195 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
brooklyng60 2011-06-18
  • 打赏
  • 举报
回复
JDK1。6下可以用javax.script.x包中的
ScriptEngineManager sem = new ScriptEngineManager();
   ScriptEngine engine = sem.getEngineByName("javascript");
Object res = engine.eval("4*4+3");//表达式
System.out.println(res);
类似上面的语句执行,得到不同类型的结果,
http://blog.chinaunix.net/space.php?uid=540802&do=blog&cuid=417006
JDK1。5下则不行,不支持javax.script,需要用到Rhino提供的js.jar包,JDK1。6实际上就是将这个包放加近来了
brooklyng60 2011-06-16
  • 打赏
  • 举报
回复
标准的Jar包都做出来了,哪个JAR包我试了,只能支持数字运算,不能支持逻辑判断组合
类似true || false && true这样的都不行,而且是在JDK1.6下运行,1.5的JDK不能运行
qybao兄弟的方法可以,我在试下,谢谢了,呵呵
brooklyng60 2011-06-15
  • 打赏
  • 举报
回复
那我如何得到strategy 参数的值啊,我只能得到各个实现中间配置的逻辑运算符
qybao 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 brooklyng60 的回复:]
boolean result = false;
//objects自定义的对象数组,对象里面包含className属性,逻辑运算符属性
for (int i = 0; i < objects.size(); i++) {
try {
if (i != objects.size() - 1) {
AuthHandler leftAuthHandler = (AuthHandler) Cl……
[/Quote]

既然可以获得对象数组中运算符属性,那么你这样做不也可以吗?如果要得到strategy,也可以循环中计算
int strategy = 0;
for (int i = 0; i < objects.size()-1; i++) {
strategy << 1;
if ("and".equals(objects.get(i).getPloy())) {
//
} else {
strategy += 1;
}
}
飞跃颠峰 2011-06-15
  • 打赏
  • 举报
回复
标准的Jar包都做出来了,为什么要自己去写呢

http://sjsky.iteye.com/blog/670250

建议LZ看看这篇文章
brooklyng60 2011-06-15
  • 打赏
  • 举报
回复
boolean result = false;
//objects自定义的对象数组,对象里面包含className属性,逻辑运算符属性
for (int i = 0; i < objects.size(); i++) {
try {
if (i != objects.size() - 1) {
AuthHandler leftAuthHandler = (AuthHandler) Class.forName(
objects.get(i).getClassName()).newInstance();
AuthHandler rightAuthHandler = (AuthHandler) Class.forName(
objects.get(i + 1).getClassName()).newInstance();
if (objects.get(i).getPloy().equals("and")) {
result = leftAuthHandler.auth(null)
&& rightAuthHandler.auth(null);
} else {
result = leftAuthHandler.auth(null)
|| rightAuthHandler.auth(null);
}
System.out.println(result);
}
} catch (InstantiationException e1) {
result=false;
} catch (IllegalAccessException e1) {
result=false;
} catch (ClassNotFoundException e1) {
result=false;
}
}
System.out.println("**************************");
System.out.println("the final result is :" + result);
数组最后的一个对象配置的逻辑运算符无效
例如
1 && 2 || 3 && 4 || 5 && 5后面的哪个没意思
整个意思就是将1与2的结果再跟2与3的结果做运算,循环下去,最后一个不运算
houzhanjun 2011-06-14
  • 打赏
  • 举报
回复
关注中
qybao 2011-06-13
  • 打赏
  • 举报
回复
逻辑运算符也要动态配置?
写个方法,按照一定的约束返回组合策略,比如
T1,T2,T3组合,传入一个整数表示组合策略,该整数以二进制的方式检验,当某位的二进制数为0,则&&,为1则||
public boolean getState(R[] r, int strategy) {
int full = 1; //用于检验传入的策略整数是否溢出
for (int i=0; i<r.length-1; i++) { //运算符号数比操作数少1,所以是r.length-1
full &= (1<<i);
}
if (stracety > full) { //溢出的情况下,根据实际情况返回
return false; //这里以false返回为例
}

boolean state = r[0].isOk();
for (int i=1; i<r.length; i++) {
int bit = ((strategy >> r.length-i) & 1);
if (bit == 0) {
state = state && r[i].isOk();
} else {
state = state || r[i].isOk();
}
}

return state;
}

//调用
R[] r = {T1, T2, T3}; //3个接口实现,所以符号个数为2,即2位的二进制,最大策略为0x11=3
strategy = 0; //二进制为00
boolean state = getState(r, strategy); //返回 T1.isOk()&&T2.isOk()&&T3.isOk()

int strategy = 1; //二进制为01
boolean state = getState(r, strategy); //返回 T1.isOk()&&T2.isOk()||T3.isOk()

strategy = 2; //二进制为10
boolean state = getState(r, strategy); //返回 T1.isOk()||T2.isOk()&&T3.isOk()

strategy = 3; //二进制为11
boolean state = getState(r, strategy); //返回 T1.isOk()||T2.isOk()||T3.isOk()

strategy = 4; //二进制为100,超出符号个数,溢出
boolean state = getState(r, strategy); //返回 对应策略溢出时的返回值





飞跃颠峰 2011-06-13
  • 打赏
  • 举报
回复
用Java的Expr4J包,不光是逻辑运算,什么表达式都能计算。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧