当前位置:  技术问答>java相关

Java中如何计算表达式

    来源: 互联网  发布时间:2015-03-26

    本文导语:  例如:用户在一个文本框中输入了一个公式:100+2*3 如何计算出结果? | /*  * Module  : Parser.java  * Scope   : Logical/Mathematical Parser  * Author  : A.Conte  * Version : 1.0.0  * Revision: 17/09/01  ...

例如:用户在一个文本框中输入了一个公式:100+2*3
如何计算出结果?

|
/*
 * Module  : Parser.java
 * Scope   : Logical/Mathematical Parser
 * Author  : A.Conte
 * Version : 1.0.0
 * Revision: 17/09/01
 * NOTE    : this class is a simply expandable Parser that
 *           now implements only The base math functions (+,-,*,/)
 *           and the 'log' function and an a ' bool = find(string, subString)'
 *           function with their priority and is able to recognize
 *           multiple parenthesis with their precedence.
 * Example :
 *           Expression: (A+B)*log(C*D+E)-F*(G+H*(I*3))
 *
 *           It's the Btree representation of the Expression above:
 *
 *                            [-]
 *                            /  *                         [*]   [*]
 *                         /|     |  *                      [+] [log][F] [+]
 *                      /|    |      /  *                   [A] [B] [+]   [G]  [*]
 *                           /|         /  *                         [*][E]     [H] [*]
 *                         /|             /  *                       [C][D]         [I] [3]
 *
 *            the Class provide itself to produce the structure represented
 *            and is possible it's representation in prefix, infix and
 *            postfix (Hungarian) mode.
 *
 **** DISCLAIMER:
 * This part of software is intented for NO PROFIT and studies only.
 * For the use of this source please contact the Author (impeto@libero.it) and
 * report his name on about message of your production.
 *
 * The 'author' makes no representations or warranties about the suitability
 * of the software, either expressed or implied, including but not limited to the
 * implied warranties of merchantability, fitness for a particular purpose, or
 * non-infringement. The 'author' shall not be liable for any damages suffered
 * by licensee as a result of using, modifying or distributing this
 * software or its derivatives.
 ****
 * @author Antonio Conte (impeto@libero.it)
 * Copyright (c) 2001 Antonio Conte. All Rights Reserved.
 */

import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 * Parsing Class
 */
public class Parser
{
  // Definition of walk Modes for Tree
  public static String PREFIX_MODE  = "PREFIX_MODE";
  public static String INFIX_MODE   = "INFIX_MODE";
  public static String POSTFIX_MODE = "POSTFIX_MODE";

  // BTree Struct References
  private String data  = null;
  private Parser left  = null;
  private Parser right = null;

  // Static definitions of separators for Parsing
  private static String separators = "+-/*(),";

  // Parsing valid operators (the priority is from left to right)
  private static String operators[] =
  { ",",
    "+", // Math Addition
    "-", // Math Substraction
    "*", // Math Multiplication
    "/", // Math Division
    "%", // Math Modulus
  "log", // Math n-logarithm
  "find" // boolean find( string, subString )
  };

  // Vector that contains the Expression tokens
  private String    completeStatement = "";
  private ArrayList parts             = new ArrayList();
  private int       numOperators      = 0;


  /**
   * Unique Default Constuctor
   */ public Parser( String Expression ) throws RuntimeException
      {
        completeStatement = Expression; // Store the complete Expression
        splitExpression( Expression );  // Splits Tokens in Expression
        parseSyntax();                  // Init Parsing...
      }

  // --- Functions to manipulate BTree -----------------
  public void   setLeft  (Parser l) { left  = l;       }
  public void   setRight (Parser r) { right = r;       }
  public void   setData  (String d) { data  = d;       }
  public Parser getLeft  ()         { return(left);    }
  public Parser getRight ()         { return(right);   }
  public String getData  ()         { return(data);    }
  public String toString ()         { return(""+data); }
  // ---------------------------------------------------

  /**
   * Recursive walk & print Function
   */ public void printWalking( String Mode )
      {
        if ( Mode.equals(PREFIX_MODE) ) System.out.print( "["+getData()+"]" );
        if ( left != null  ) left.printWalking(Mode);
        if ( Mode.equals(INFIX_MODE) ) System.out.print( "["+getData()+"]" );
        if ( right != null ) right.printWalking(Mode);
        if ( Mode.equals(POSTFIX_MODE) ) System.out.print( "["+getData()+"]" );
      }

  /*
   * Expression Tokenizator and Store in Parts
   */ private void splitExpression( String Expression )
      {
        // Temp Classes for conversion
        StringTokenizer statements = new StringTokenizer( Expression, separators, true );
        String          tempToken;

        // Renew Parts container
        parts.clear();
        numOperators = 0;

        // Copy Tokens in Vector
        while ( statements.hasMoreElements() )
        {
          // Recognized token
          tempToken = (String)statements.nextElement();

          // Count operators
          for (int i=0; i 

    
 
 

您可能感兴趣的文章:

  • Java表达式引擎 Aviator
  • Java正则表达式 reb4j
  • Java表达式语言 JUEL
  • JAVA的类库中是否有正则表达式这样的东东?
  • Java表达式语法解析库 parboiled
  • Java表达式解析器 JExel
  • java 正则表达式基础,实例学习资料收集大全 原创
  • Java算术表达式计算类库 ExpressionJ
  • java正则表达式验证函数
  • java正则表达式获取url的host示例
  • java 公式解析 表达式解析 expression-analyzer
  • java正则表达式提取数字的方法实例
  • java正则表达式使用示例
  • java正则表达式验证邮箱、电话号码示例
  • java正则表达式应用的实例代码
  • Java的表达式计算引擎 Expr4J
  • java中 利用正则表达式提取( )内内容
  • 利用Java正则表达式校验邮箱与手机号
  • java正则表达式表单验证类工具类(验证邮箱、手机号码、qq号码等)
  • java正则表达式解析html示例分享
  • java使用正则表达为数字添加千位符的简单方法
  • 在java中,如何表达界于20和40之间?
  • 请问 java.lang.Float x= new java.lang.Float(request.getParameter("x"))的表达正确吗
  • java使用正则表达校验手机号码示例(手机号码正则)
  • JAVA有没有这样的类,或怎么表达这样的数据?
  • Java8新特性之Lambda表达式浅析
  • java正则表达式匹配网页所有网址和链接文字的示例
  • 通过Java正则表达式去掉SQL代码中回车换行和多余空格
  • java表达式计算 QLExpress
  • Java 正则表达式功能及应用
  • Java/Js下使用正则表达式匹配嵌套Html标签
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java计算机代数计算工具 Symja
  • 哈希计算工具 java-hash
  • Java 计算机代数系统 MathEclipse
  • Java 计算机视觉库 BoofCV
  • 利用Java正则表达式校验邮箱与手机号 iis7站长之家
  • 音频特效计算Java库 Jipes
  • Java科学计算包 JScience
  • 请教:有关Java的数据计算的问题???
  • 一个小问题,JAVA中计算某个过程的执行时间,回答了马上给分,10分钟内响应啊
  • 怎样用Java语言获得计算机系统信息??
  • JAVA中怎样捕捉计算机SYSTEM的句柄??
  • Java数值计算包 Commons Math
  • java中有无计算两点间斜率的函数?
  • Java数学计算包 JSci
  • Java数值计算包 jLab
  • J2ME浮点数计算包 Real.java
  • JAVA不同数据类型的转换和计算(急~~~~~!!!!在线等待!!!!!)
  • 求助!关于翻页的问题,在JAVA中如何计算从数据库中取出的结果集总共可显示多少页?
  • java阶乘计算获得结果末尾0的个数代码实现
  • 哪未前辈可以推荐2本除学JAVA的教材,本人计算机系
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3