亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java代碼執行字符串中的邏輯運算方法

2024-07-14 08:41:38
字體:
來源:轉載
供稿:網友

方式一

public class Test{ public static void main(String[] args) throws Exception {   String str = "(a or b) and c";   str = str.replaceAll("or", "||");   str = str.replaceAll("and", "&&");   System.out.println(str);   ScriptEngineManager manager = new ScriptEngineManager();   ScriptEngine engine = manager.getEngineByName("js");   engine.put("a",true);   engine.put("b",false);   engine.put("c",true);     Object result = engine.eval_r(str);   System.out.println("結果類型:" + result.getClass().getName() + ",計算結果:" + result);  }}

這種方式使用js的方式進行運算,使用較簡單,但是當運算double類型的四則運算時結果會出現循環小數,運算結果會出現問題.

方式二(能夠保證四則運算精度):

/** * @Project:  BizRule   * @File:   org.coffeesweet.util.MathExpress.java * @Author:  coffeesweet * @Date:   2011-3-28 * @Description: 2011 coffeesweet Inc. All rights reserved. */package org.coffeesweet.util;import java.math.BigDecimal;import java.math.MathContext;import java.math.RoundingMode;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.StringTokenizer;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * @author coffeesweet * +,-,*,/四則運算的表達式逆波蘭解析計算類,精確計算,應用BigDecimal類處理 * 支持負數,但規范除整個表達式第一個數為負數時可以不出現在'('后,其它表達式中間任何位置的 * 負數必須出現在'('后,即:用括號括起來。比如:-3+(-2+1)*10或-3+((-2)+1)*10或(-3)+(-2+1)*10或(-3)+((-2)+1)*10 */public class MathExpress { /**  * +  */ private final static String OP1 = "+"; /**  * -  */ private final static String OP2 = "-"; /**  * *  */ private final static String OP3 = "*"; /**  * /  */ private final static String OP4 = "/"; /**  * ^  */// private final static String OP5 = "^"; /**  * %  */// private final static String OP6 = "%"; /**  * (  */ private final static String OPSTART = "("; /**  * )  */ private final static String OPEND = ")"; /**  * !用來替代負數前面的'-'  */// private final static String NEGATIVESING = "!"; /**  * !用來替代負數前面的'+'  */// private final static String PLUSSING = "@"; /**  * '#'用來代表運算級別最低的特殊字符  */// private final static String LOWESTSING = "#"; //最原始的四則運算式 private String expBase; //經過初始化處理后的四則運算式 private String expInited; //精度 private int precision=10; //取舍模式 private RoundingMode roundingMode=RoundingMode.HALF_UP; //精度上下文 private MathContext mc; //四則運算解析 private List<String> expList = new ArrayList<String>(); //存放逆波蘭表達式 private List<String> rpnList = new ArrayList<String>(); public MathExpress(){ } public MathExpress(String expBase) {  init(expBase,this.precision,this.roundingMode); } public MathExpress(String expBase,int precision,RoundingMode roundingMode){  init(expBase,precision,roundingMode); } public void init(String expBase,int precision,RoundingMode roundingMode){  this.expBase = expBase;  this.precision = precision;  this.roundingMode = roundingMode;  this.mc = new MathContext(precision,roundingMode);  this.expInited = initExpress(expBase);  StringTokenizer st = new StringTokenizer(this.expInited,"+-*/^%()",true);  while(st.hasMoreElements()){   this.expList.add(st.nextElement().toString().trim());  }  this.rpnList = initRPN(this.expList); } /**  * @return the expBase  */ public String getExpBase() {  return expBase; } /**  * @param expBase the expBase to set  */ public void setExpBase(String expBase) {  this.expBase = expBase; } /**  * @return the expInited  */ public String getExpInited() {  return expInited; } /**  * @param expInited the expInited to set  */ public void setExpInited(String expInited) {  this.expInited = expInited; } /**  * @return the precision  */ public int getPrecision() {  return precision; } /**  * @param precision the precision to set  */ public void setPrecision(int precision) {  this.precision = precision; } /**  * @return the roundingMode  */ public RoundingMode getRoundingMode() {  return roundingMode; } /**  * @param roundingMode the roundingMode to set  */ public void setRoundingMode(RoundingMode roundingMode) {  this.roundingMode = roundingMode; } /**  * @return the expList  */ public List<String> getExpList() {  return expList; } /**  * @param expList the expList to set  */ public void setExpList(List<String> expList) {  this.expList = expList; } /**  * @return the rpnList  */ public List<String> getRpnList() {  return rpnList; } /**  * @param rpnList the rpnList to set  */ public void setRpnList(List<String> rpnList) {  this.rpnList = rpnList; } /**  * @return the mc  */ public MathContext getMc() {  return mc; } /**  * @param mc the mc to set  */ public void setMc(MathContext mc) {  this.mc = mc; } /**  * 去除空白字符和在負號'-'前加'0',便于后面的StringTokenizer  * @param exp  * @return  */ private static String initExpress(String exp){  String reStr = null;  reStr = exp.replaceAll("//s", "");  if(reStr.startsWith("-")){   reStr = "0"+reStr;  }  reStr = reStr.replaceAll("//(//-", "(0-");  return reStr; } /**  * 是否是整數或是浮點數,但默認-05.15這種也認為是正確的格式  * @param str  * @return  */ private boolean isNumber(String str){  Pattern p = Pattern.compile("^(-?//d+)(//.//d+)?$");  Matcher m = p.matcher(str);  boolean isNumber = m.matches();  return isNumber; } /**  * 設置優先級順序()設置與否無所謂  * @param sign  * @return  */ private int precedence(String str){  char sign = str.charAt(0);  switch(sign){   case '+':   case '-':    return 1;   case '*':   case '/':    return 2;   case '^':   case '%':    return 3;   case '(':   case ')'://   case '#':   default:    return 0;  } } /**  * 轉變為逆波蘭表達式  * @param strList  * @return  */ public List<String> initRPN(List<String> strList){  List<String> returnList = new ArrayList<String>();  //用來存放操作符的棧  Stack stack = new Stack();//  stack.push(LOWESTSING);  int length = strList.size();  for(int i=0;i<length;i++ ){   String str = strList.get(i);   if(isNumber(str)){    returnList.add(str);   }else{    if(str.equals(OPSTART)){     //'('直接入棧     stack.push(str);    }else if(str.equals(OPEND)){     //')'     //進行出棧操作,直到棧為空或者遇到第一個左括號      while (!stack.isEmpty()) {       //將棧頂字符串做出棧操作       String tempC = stack.pop();       if (!tempC.equals(OPSTART)) {        //如果不是左括號,則將字符串直接放到逆波蘭鏈表的最后        returnList.add(tempC);       }else{        //如果是左括號,退出循環操作        break;       }      }     }else{     if (stack.isEmpty()) {      //如果棧內為空       //將當前字符串直接壓棧       stack.push(str);      }else{      //棧不空,比較運算符優先級順序      if(precedence(stack.top())>=precedence(str)){       //如果棧頂元素優先級大于當前元素優先級則       while(!stack.isEmpty() && precedence(stack.top())>=precedence(str)){        returnList.add(stack.pop());       }      }      stack.push(str);     }    }   }  }  //如果棧不為空,則將棧中所有元素出棧放到逆波蘭鏈表的最后   while (!stack.isEmpty()) {   returnList.add(stack.pop());  }  return returnList; } /**  * 計算逆波蘭表達式  * @param rpnList  * @return  */ public String caculate(List<String> rpnList){  Stack numberStack = new Stack();   int length=rpnList.size();   for(int i=0;i<length;i++){    String temp=rpnList.get(i);    if(isNumber(temp)){     numberStack.push(temp);    }else{     BigDecimal tempNumber1 = new BigDecimal(numberStack.pop(),this.mc);    BigDecimal tempNumber2 = new BigDecimal(numberStack.pop(),this.mc);    BigDecimal tempNumber = new BigDecimal("0",this.mc);    if(temp.equals(OP1)){      tempNumber=tempNumber2.add(tempNumber1);     }else if(temp.equals(OP2)){      tempNumber=tempNumber2.subtract(tempNumber1);     }else if(temp.equals(OP3)){      tempNumber=tempNumber2.multiply(tempNumber1);     }else if(temp.equals(OP4)){      tempNumber=tempNumber2.divide(tempNumber1,        precision,        roundingMode);     }     numberStack.push(tempNumber.toString());    }   }   return numberStack.pop(); } /**  * 按照類的缺省參數進行計算  * @return  */ public String caculate(){  return caculate(this.rpnList); } /**  * 數字條件表達式精確比較  * eg: "3.0>2" "1<5" "1==5" "1!=5" "(1.0+2)>3" "((-0.9+3)>=2. 1)"  * 不支持&&,||等連接符  * @param str  * @return  */ public static boolean compareTo(String strParm){  boolean reBoolean = false;  boolean isParentheses = false;//標記是否有()括上整個字符串  String str = initExpress(strParm);  Pattern p = Pattern.compile("^//([//s//S]*//)$");  Matcher m = p.matcher(str);  isParentheses = m.matches();  if(-1==str.indexOf(">=")&&-1==str.indexOf("<=")&&-1==str.indexOf("==")&&-1==str.indexOf("!=")){   if(-1==str.indexOf(">")&&-1==str.indexOf("<"))   throw new IllegalArgumentException("異常:條件表達式不正確!");  }  if(-1 != str.indexOf(">=")){   String[] strTemps = str.split(">=");   if(isParentheses){    strTemps[0] = strTemps[0] + ")";    strTemps[1] = "(" + strTemps[1];   }   int r = new BigDecimal((new MathExpress(strTemps[0]).caculate())).compareTo(new BigDecimal((new MathExpress(strTemps[1]).caculate())));   if( -1 == r ){    reBoolean = false;   }else{    reBoolean = true;   }  }else if(-1 != str.indexOf("<=")){   String[] strTemps = str.split("<=");   if(isParentheses){    strTemps[0] = strTemps[0] + ")";    strTemps[1] = "(" + strTemps[1];   }   int r = new BigDecimal((new MathExpress(strTemps[0]).caculate())).compareTo(new BigDecimal((new MathExpress(strTemps[1]).caculate())));   if( 1 == r ){    reBoolean = false;   }else{    reBoolean = true;   }  }else if(-1 != str.indexOf("==")){   String[] strTemps = str.split("==");   if(isParentheses){    strTemps[0] = strTemps[0] + ")";    strTemps[1] = "(" + strTemps[1];   }   int r = new BigDecimal((new MathExpress(strTemps[0]).caculate())).compareTo(new BigDecimal((new MathExpress(strTemps[1]).caculate())));   if( 0 == r ){    reBoolean = true;   }else{    reBoolean = false;   }  }else if(-1 != str.indexOf("!=")){   String[] strTemps = str.split("!=");   if(isParentheses){    strTemps[0] = strTemps[0] + ")";    strTemps[1] = "(" + strTemps[1];   }   int r = new BigDecimal((new MathExpress(strTemps[0]).caculate())).compareTo(new BigDecimal((new MathExpress(strTemps[1]).caculate())));   if( 0 != r ){    reBoolean = true;   }else{    reBoolean = false;   }  }else if((-1 != str.indexOf(">")) && (-1 == str.indexOf("="))){   String[] strTemps = str.split(">");   if(isParentheses){    strTemps[0] = strTemps[0] + ")";    strTemps[1] = "(" + strTemps[1];   }   int r = new BigDecimal((new MathExpress(strTemps[0]).caculate())).compareTo(new BigDecimal((new MathExpress(strTemps[1]).caculate())));   if( 1 == r ){    reBoolean = true;   }else{    reBoolean = false;   }  }else if((-1 != str.indexOf("<")) && (-1 == str.indexOf("="))){   String[] strTemps = str.split("<");   if(isParentheses){    strTemps[0] = strTemps[0] + ")";    strTemps[1] = "(" + strTemps[1];   }   int r = new BigDecimal((new MathExpress(strTemps[0]).caculate())).compareTo(new BigDecimal((new MathExpress(strTemps[1]).caculate())));   if( -1 == r ){    reBoolean = true;   }else{    reBoolean = false;   }  }  return reBoolean; } public static void main(String...args){//  MathExpress me = new MathExpress("-(-0.5+0.1)*10+2",10,RoundingMode.HALF_UP);//  System.out.println(me.getExpList());//  List<String> tempList = me.initRPN(me.getExpList());//  System.out.println(tempList);//  String resultStr = me.caculate(tempList);//  System.out.println(resultStr);  MathExpress me = new MathExpress("-(-1.5000000003+0.1)*10+2");  String resultStr = me.caculate();  BigDecimal bd = new BigDecimal(resultStr);  BigDecimal bd2 = bd.setScale(2, RoundingMode.HALF_UP);  System.out.println(me.caculate());  System.out.println(bd.toString());  System.out.println(bd.scale());  System.out.println(bd2.toString());  System.out.println(bd2.scale());//  System.out.println("------------------------------------");//  Pattern p = Pattern.compile("^//([//s//S]*//)$");//匹配類似以'('開頭')'結尾的字符串//  Matcher m = p.matcher("(2. 0>2.22)");//  System.out.println(m.matches());  boolean reBoolean = MathExpress.compareTo("((-8.0+3)>=2. 1)");  System.out.println(reBoolean); } /**  * 棧  */ private class Stack {  LinkedList<String> stackList = new LinkedList<String>();  public Stack() {  }  /**   * 入棧   * @param expression   */  public void push(String expression) {   stackList.addLast(expression);  }  /**   * 出棧   * @return   */  public String pop() {   return stackList.removeLast();  }  /**   * 棧頂元素   * @return   */  public String top() {   return stackList.getLast();  }  /**   * 棧是否為空   * @return   */  public boolean isEmpty() {   return stackList.isEmpty();  } }}

以上這篇java代碼執行字符串中的邏輯運算方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品一区av在线播放| 色综合久久中文字幕综合网小说| 亚洲精品国产综合久久| 日韩精品999| 57pao成人国产永久免费| 91中文字幕一区| 久久99久久99精品免观看粉嫩| 欧美激情国产日韩精品一区18| 欧美精品一区三区| 亚洲亚裔videos黑人hd| 亚洲精品国产精品国自产观看浪潮| 欧美精品久久一区二区| 黄网动漫久久久| 欧美另类老肥妇| 国产精品激情av在线播放| 久久久久久久亚洲精品| 国产精品美女www爽爽爽视频| 国产精品自拍偷拍| 一区二区三区日韩在线| 最近中文字幕mv在线一区二区三区四区| 亚洲第一区第二区| 91精品国产高清自在线看超| 日韩一区视频在线| 亚洲欧美资源在线| 国产精选久久久久久| 日韩精品中文字幕久久臀| 亚洲国产精品专区久久| 欧美激情在线狂野欧美精品| 国产精品久久久久久av福利| 视频在线一区二区| 国产精品日韩欧美大师| 最新91在线视频| 国产美女精品视频免费观看| 亚洲综合色av| 国产精品ⅴa在线观看h| 日韩a**中文字幕| 中文字幕亚洲字幕| 51久久精品夜色国产麻豆| 伊人激情综合网| 亚洲最大福利视频网| 国产色视频一区| 亚洲男女性事视频| 日韩免费观看高清| 国外日韩电影在线观看| 欧美激情国内偷拍| 亚洲第一免费播放区| 国产精品久久久久久久9999| 亚洲黄色有码视频| 日韩**中文字幕毛片| 亚洲美女精品久久| 亚洲a在线播放| 午夜精品一区二区三区av| 在线亚洲国产精品网| 在线观看亚洲区| 久久久av网站| 日本国产一区二区三区| 91国产在线精品| 91国内免费在线视频| 在线观看视频99| 亚洲日韩中文字幕在线播放| 国产亚洲精品美女久久久久| 国产盗摄xxxx视频xxx69| 91亚洲国产成人精品性色| 亚洲精品电影在线| 久久国产精品久久国产精品| 中文字幕av一区| 国产午夜精品麻豆| 亚洲精品成人网| 日韩极品精品视频免费观看| 97热精品视频官网| 欧美日韩亚洲精品内裤| 久久99国产精品久久久久久久久| 亚洲黄色片网站| 欧美成人免费播放| 在线观看亚洲区| 亚洲91精品在线| 91大神在线播放精品| 亚洲毛片一区二区| 亚洲欧洲免费视频| 成人黄色免费在线观看| 欧美成人精品三级在线观看| 国产精品美女在线| 欧美激情国产高清| 日韩电影中文字幕av| 精品视频中文字幕| 亚洲欧洲美洲在线综合| 成人免费福利在线| 欧美黑人xxxⅹ高潮交| 日韩成人网免费视频| 91av在线网站| 亚洲色图第三页| 久久中文字幕一区| 高清亚洲成在人网站天堂| 欧美最猛性xxxx| 成人夜晚看av| 欧美刺激性大交免费视频| 自拍偷拍亚洲精品| 精品国偷自产在线视频| 欧美电影第一页| 中文字幕9999| 成人免费在线网址| 色爱av美腿丝袜综合粉嫩av| 亚洲欧洲在线免费| 精品成人久久av| 精品高清美女精品国产区| 热草久综合在线| xvideos亚洲| 欧美在线影院在线视频| 欧美高清视频在线观看| 成人a免费视频| 日韩中文字幕精品| 国模精品一区二区三区色天香| 精品久久久久久国产91| 国产精品亚洲美女av网站| 7m第一福利500精品视频| 亚洲视频axxx| 欧美与欧洲交xxxx免费观看| 午夜精品久久久久久久久久久久| 日本a级片电影一区二区| 国产美女91呻吟求| 欧美激情一级精品国产| 亚洲区bt下载| 亚洲无线码在线一区观看| 久久夜精品香蕉| 亚洲美女av电影| 亚洲国产精品成人精品| 亚洲精品欧美日韩专区| 欧洲美女7788成人免费视频| 国产一区二区三区18| 中文字幕亚洲图片| 亚洲新中文字幕| 91精品国产自产在线老师啪| 亚洲免费电影一区| 日韩专区在线观看| 一区二区欧美日韩视频| 一区二区三区视频免费| 2021国产精品视频| 国产精品色悠悠| 91精品国产乱码久久久久久久久| 成人网页在线免费观看| 久久99精品久久久久久青青91| 国产欧美精品一区二区三区介绍| 欧美成人免费视频| 国产一区二区三区精品久久久| 亚洲成人中文字幕| 亚洲精品一区二三区不卡| 国产精品丝袜久久久久久高清| 久久精品视频播放| 国产在线999| 影音先锋欧美在线资源| www.午夜精品| 成人免费在线视频网站| 茄子视频成人在线| 91美女福利视频高清| 欧美性猛交xxxx| 欧美午夜美女看片| 日韩精品在线观看一区二区| 69视频在线免费观看| 欧美精品在线观看| 国产精品免费久久久| 欧美国产第二页| 成人中文字幕在线观看| 色噜噜国产精品视频一区二区| 国产精品自拍偷拍|