Java 如何使用令牌迭代器组合数字
我有一段代码,它读取表达式的每个标记。输出应该是这样的。我怎样才能把这些数字放在一起 下一个标记:[15] 下一个令牌:[*] 下一个令牌:[(] 下一个令牌:[26]Java 如何使用令牌迭代器组合数字,java,iterator,expression,token,Java,Iterator,Expression,Token,我有一段代码,它读取表达式的每个标记。输出应该是这样的。我怎样才能把这些数字放在一起 下一个标记:[15] 下一个令牌:[*] 下一个令牌:[(] 下一个令牌:[26] 等等 但是我得到了这个 下一个标记:[1] 下一个标记:[5] 下一个令牌:[*] 下一个令牌:[(] 下一个标记:[2] 下一个标记:[6] import java.util.Iterator; import java.util.Scanner; public class TokenIter implements Iter
等等 但是我得到了这个 下一个标记:[1] 下一个标记:[5] 下一个令牌:[*] 下一个令牌:[(] 下一个标记:[2] 下一个标记:[6]
import java.util.Iterator;
import java.util.Scanner;
public class TokenIter implements Iterator<String>{
// This class builds a Token Iterator, that produces
// Strings containing numbers (sequences of digits) and
// special characters: "(" ")" "+" "-" "*" "/"
//input line to be tokenized
private String line;
// the next Token, null if no next Token
private String nextToken;
public TokenIter(String line){
this.line = line;
}
static int counter = 0;
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException();
}
public static void main(String[] args){
String line = " 15*(26+37) - 432/5*61 - (321-1234567) ";
System.out.println("line: [" + line + "]");
TokenIter tokIt = new TokenIter(line);
// print tokens in square brackets to check absence of white space
while(tokIt.hasNext()){
if (tokIt.next() != "no")
System.out.println("next token: [" + tokIt.next() + "]");
else
{
}
counter++;
}
}
public boolean hasNext(){
if (counter < line.length())
{
return true;
}
else
{
return false;
}
}
//char c;
public String next() {
//String L = line.trim();
String s = "";
// for (int index =0; index < L.length(); index++){
if (!hasNext())
return null;
else{
{
char c = line.charAt(counter);
if( c == ('/'))
{
counter = counter++;
s = "" + c;
return s;
}
if( c == ('+'))
{
counter = counter++;
s = "" + c;
return s;
}
if( c == ('*'))
{
counter = counter++;
s = "" + c;
return s;
}
if( c == ('-'))
{
counter = counter++;
s = "" + c;
return s;
}
if( c == ('('))
{
counter = counter++;
s = "" + c;
return s;
}
if( c == (')'))
{
counter = counter++;
s = "" + c;
return s;
}
else if (c == ' ')
{
counter = counter++;
return "no";
}
else if (c == ('0'|'1'| '2' | '3'|'4'|'5'| '6'| '7' |'8' | '9'))
{
counter = counter++;
return s;
}
else if (Character.isDigit(c)){
if((c == '0') || (c == '1') ||(c == '2') ||(c == '3') ||(c == '4') ||(c == '5') ||(c == '6') ||(c == '7') ||(c == '8') || (c == '9'))
counter = counter++;
s += "" + c;
return s;
}
}
}
return s;
}}
import java.util.Iterator;
导入java.util.Scanner;
公共类TokenIter实现迭代器{
//此类构建一个令牌迭代器,该迭代器生成
//包含数字(数字序列)和
//特殊字符:(“”)“”+“”-“”*“”/“”
//要标记化的输入行
专用字符串线;
//下一个令牌,如果没有下一个令牌,则为null
私有字符串nextToken;
公共令牌(字符串行){
this.line=line;
}
静态整数计数器=0;
公共空间删除(){
//TODO自动生成的方法存根
抛出新的UnsupportedOperationException();
}
公共静态void main(字符串[]args){
字符串行=“15*(26+37)-432/5*61-(321-1234567)”;
System.out.println(“行:[“+行+”]);
TokenIter tokIt=新的TokenIter(线);
//在方括号中打印代币以检查是否存在空白
while(tokIt.hasNext()){
if(tokIt.next()!=“否”)
System.out.println(“下一个令牌:[“+tokIt.next()+”]);
其他的
{
}
计数器++;
}
}
公共布尔值hasNext(){
if(计数器
似乎您正在尝试构建数学表达式反编译程序。有多种方法可以实现此目的。一种方法是使用字符串标记器并设置分隔符:
公共字符串nextToken(字符串delim)
但是,不再接受使用字符串标记器类。建议使用split方法。这可以通过一些正则表达式魔法轻松完成。其思想是您希望拆分字符串,但同时保留分隔符。这可以通过向前看或向后看来完成,但分隔符最终会附着在一边或另一边。To修复您需要同时使用两者的问题。这将导致分隔符作为单独的标记返回
// Define the characters to split on: ' ', '+', '-', '*', '\', '(', ')'
final String splitOn = "\\+|-|\\*|/|\\(|\\)";
final String lookAheadGroup = "(?=" + splitOn + ")";
final String lookBehindGroup = "(?<=" + splitOn + ")";
final String regex = "(" + lookBehindGroup + "|" + lookAheadGroup + ")";
或者用扫描仪
System.out.println("\n\nScanner");
Scanner scanner = new Scanner(line);
scanner.useDelimiter(regex);
while(scanner.hasNext()) {
System.out.printf("'%s'\n", scanner.next());
}
scanner.close();
示例输出
请注意,令牌没有额外的空白区域,因此,如果后期处理对其敏感,则必须这样做
'15', '*', '(', '26', '+', '37', ')', ' ', '-', ' 432', '/', '5', '*', '61 ', '-', ' ', '(', '321', '-', '1234567', ')',
你需要一个
while
循环来累加相邻的数字。很难看到最后一个块的点,否则如果块和上一个块,它就不会像你想象的那样了。@EJP我试着做了一个while循环,但我仍然得到相同的结果。我需要添加什么?
'15', '*', '(', '26', '+', '37', ')', ' ', '-', ' 432', '/', '5', '*', '61 ', '-', ' ', '(', '321', '-', '1234567', ')',