gpt4 book ai didi

java - 复杂数学表达式的高级分词器

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:28:41 25 4
gpt4 key购买 nike

我想标记一个由整数、 float 、运算符、函数、变量和括号组成的字符串。下面的例子应该可以阐明问题的本质:

当前状态:

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

解析为请求的字符串列表的示例代码(您可能想直接使用分词器或至少使用对象列表,以便可以将数字直接存储为 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, (, x, ,, y, ), ^, z, ), -, 300.12]

关于java - 复杂数学表达式的高级分词器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com