加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 用于复杂数学表达式的高级标记生成器

发布时间:2020-12-15 04:10:06 所属栏目:Java 来源:网络整理
导读:我想标记一个由整数,浮点数,运算符,函数,变量和括号组成的字符串.以下示例应该提亮问题的本质: 当前状态: String infix = 4*x+5.2024*(Log(x,y)^z)-300.12 期望的状态: String tokBuf[0]=4 String tokBuf[1]=* String tokBuf[2]=x String tokBuf[3]=+ Str
我想标记一个由整数,浮点数,运算符,函数,变量和括号组成的字符串.以下示例应该提亮问题的本质:

当前状态:

String infix = 4*x+5.2024*(Log(x,y)^z)-300.12

期望的状态:

String tokBuf[0]=4 
 String tokBuf[1]=* 
 String tokBuf[2]=x 
 String tokBuf[3]=+ 
 String tokBuf[4]=5.2024 
 String tokBuf[5]=* 
 String tokBuf[6]=( 
 String tokBuf[7]=Log
 String tokBuf[8]=( 
 String tokBuf[9]=x
 String tokBuf[10]=,String tokBuf[11]=y 
 String tokBuf[12]=) 
 String tokBuf[13]=^ 
 String tokBuf[14]=z 
 String tokBuf[15]=) 
 String tokBuf[16]=- 
 String tokBuf[17]=300.12

所有提示和解决方案将不胜感激.

解决方法

使用Java流标记生成器.界面有点奇怪,但人们会习惯它:

http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html

解析所请求的String列表的示例代码(您可能希望直接使用tokenizer或至少使用Object列表,这样您可以直接将数字存储为Double):

public static List<String> tokenize(String s) throws IOException {
  StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));
  tokenizer.ordinaryChar('-');  // Don't parse minus as part of numbers.
  tokenizer.ordinaryChar('/');  // Don't treat slash as a comment start.
  List<String> tokBuf = new ArrayList<String>();
  while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
    switch(tokenizer.ttype) {
      case StreamTokenizer.TT_NUMBER:
        tokBuf.add(String.valueOf(tokenizer.nval));
        break;
      case StreamTokenizer.TT_WORD:
        tokBuf.add(tokenizer.sval);
        break;
      default:  // operator
        tokBuf.add(String.valueOf((char) tokenizer.ttype));
    }
  }
  return tokBuf; 
}

测试运行:

System.out.println(tokenize("4*x+5.2024*(Log(x,y)^z)-300.12"));
[4.0,*,x,+,5.2024,(,Log,y,),^,z,-,300.12]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读