0x6*_*C74 3 java string tokenize
我想标记一个由整数,浮点数,运算符,函数,变量和括号组成的字符串.以下示例应该提亮问题的本质:
当前状态:
String infix = 4*x+5.2024*(Log(x,y)^z)-300.12
Run Code Online (Sandbox Code Playgroud)
期望的状态:
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
Run Code Online (Sandbox Code Playgroud)
所有提示和解决方案将不胜感激.
使用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;
}
Run Code Online (Sandbox Code Playgroud)
测试运行:
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]
Run Code Online (Sandbox Code Playgroud)